2013-10-20 63 views
1

我有一個我正在安裝的MSI'd應用程序,忽略了%programfiles%環境變量。從procmon的蹤跡來看,它似乎正在使用HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesDir的值。MSI忽略%programfiles%環境變量

爲什麼會這樣做(我的意思是使用這個值的常見做法,或者這是暴露給MSI構建者的唯一值)?

HKCU\Environment\ProgramFiles & HKLM\System\CurrentControlSet\Control\Session Manager\Environment\ProgramFiles可供使用?爲什麼還有其他註冊表值?

+0

不,它使用SHGetKnownFolderPath()。由於appcompat的原因,註冊表項被保留,太多的程序讀取註冊表而不是使用api函數。改變%ProgramFiles%是永遠不會做你希望它會做的。 –

+0

我不太清楚讀取註冊表時出現什麼問題,而不是使用API​​函數,但我認爲後者是更乾淨/錯誤檢查/等方式。然而,有趣的是,該程序似乎正在檢查兩者。可能超出範圍,但是您是否知道如何安全地移動Program Files目錄(請參閱http://support.microsoft.com/kb/933700/en-us)? – user66001

+0

你是對的,這是關鍵的問題。詢問superuser.com。如果您要編寫一個移動Program Files目錄的安裝程序,那麼您最好籤署一個[像這樣的服務](http://www.bodyguardservice.net/eng/index.html)。 –

回答

1

Windows安裝程序公開ProgramFilesFolderProgramFiles64Folder屬性。行爲是記錄的,但實施不是。你只應該依靠這些屬性而不是其他技術。

正式地,您需要一個使用ProgramFiles64Folder屬性轉到64位機器上的C:\ Program Files \的64位MSI。即使您使用自定義操作將目錄顯式設置爲32位MSI中的此路徑,安裝程序也會攔截該路徑並將其重定向到其認爲的目錄。這是爲了應用程序兼容性目的。

有一種無證的方式來顛覆這種行爲。使用自定義操作獲取預期的文件夾並將其轉換爲短路徑(C:\ Progra〜1)。安裝程序不會將其檢測爲無效,並允許它通過。使用這個需要您自擔風險。