2012-08-27 66 views
0

我們正在研究一個NSIS安裝程序,它編輯註冊表中的幾個文件類型以更改它們圖標和運行它們的應用程序。
我們的工作流程在Win7/32位,WinXP/32和WinXP/64上正常工作,但在Win7/64上無法正常工作。我們已經在多臺Win7/64計算機上測試過這個問題,並且這兩個Win7/64實例的問題都是一致的。
另外一個細節是,它只有在覆蓋現有的關聯時纔會生效,因爲創建一個新關聯可以正常工作。Windows 7 64位文件和圖標關聯不一致(與Win7/32,WinXP/32和WinXP/64相比)

註冊表編輯只需設置DefaultIconshell/open/command註冊表編輯完成後,我們使用SHChangeNotify系統調用來強制shell使用新設置進行更新。
在Win7/64上,已在註冊表中的文件類型未更新爲新值。

; Tell the shell to reset its icon cache 
System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v \ 
(0x08000000, 0, 0, 0)' 

任何幫助非常感謝,特別是不涉及系統重新啓動或重新啓動資源管理器的解決方案。感謝您的任何/所有幫助! -Chris

回答

0

此問題可能與x64上的註冊表往往出錯有關:xx:VirtualizationRedirectorReflection。你也可能錯誤地將文件擴展名映射到progid? (難以分辨何時您不發佈任何代碼或告訴我們您正在更改哪種文件類型)

要關閉虛擬化,請確保您的腳本包含RequestExecutionLevel admin

您可以強制NSIS使用64位註冊表SetRegView,但使用Process Monitor來監視安裝程序可能是一個更好的主意,這樣您就可以看到實際寫入的位置。然後,您可以監視explorer.exe以查看其正在讀取的位置。