簡體   English   中英

為什么Windows Vista x64上的x86 WiX安裝程序不能將密鑰寫入注冊表中的Wow6432Node?

[英]Why does an x86 WiX installer on Windows Vista x64 not write keys to Wow6432Node in the registry?

我有一個寫入HKLM\\Software\\DroidExplorer\\InstallPath的安裝程序。 在任何x86機器上它都可以正常寫入預期的位置,在Windows XP x64和Windows 7 x64上它也會寫入預期的位置,實際上是HKLM\\Software\\Wow6432Node\\DroidExplorer\\InstallPath

稍后在安裝過程中,我的引導程序(也是x86)會嘗試讀取該值。 在所有x86 Windows機器上它都是成功的,在Windows XP x64和Windows 7 x64上,但Windows Vista x64無法找到密鑰。 如果我查看注冊表,它實際上並沒有將它寫入Windows Vista上的Wow6432Node; 它將它寫入Software\\DroidExplorer\\InstallPath

如果我沒有強行告訴安裝程序寫入Wow6432Node,它會將值寫入Software\\DroidExplorer\\InstallPath ,但由於注冊表反射 ,引導程序仍然會嘗試查看Wow6432Node。 這適用於所有x64系統。

為什么Windows Vista x64是我遇到此問題的唯一一個? 有沒有解決的辦法?

我只是想添加一個仍然打開的編輯。 以下建議均未解決此問題。

注冊表重定向在Windows Vista x64上失敗的事實非常奇怪,因為根據MSDN, 注冊表重定向器 ,Windows Vista也應該受其影響。

另一個答案中的注釋,“ 這不起作用,當我構建應用程序的x64版本,安裝在x64 PFiles中時,它告訴我我使用的是64位安裝目錄並且不允許Win64 =沒有 “讓我對你正在構建什么類型的MSI感到困惑。

注冊表重定向只會影響MSI中的32位組件。 如果WiX項目的目標平台是x86,則生成的MSI是32位MSI,並且所有組件都將受到注冊表重定向的影響。

另一方面,如果WiX項目的目標平台是x64,那么將受注冊表重定向影響的唯一組件將是那些明確標記為Win64 = no的組件。 (默認情況下,如果您的目標平台是x64,則WiX假定所有組件都是64位。)

請注意,如果注冊表項的組件包含在ProgramFiles64文件夾中,則WiX將假定它是64位組件,並且它不會受到注冊表重定向的影響。 這就是WiX不允許您在該組件上指定Win64 = no的原因。

您應該驗證包含您希望重定向的注冊表項的每個組件是否都配置為使用ProgramFiles(32位),因為它是x86和x64 MSI文件中的父目錄。

可能你必須更改32位引導程序的代碼。 您應該測試應用程序是否在64位操作系統下運行,例如關於IsWow64Process函數(請參閱http://msdn.microsoft.com/en-us/library/ms684139.aspx )。 如果操作系統是64位,則應使用KEY_QUERY_VALUE | KEY_WOW64_64KEY打開密鑰 KEY_QUERY_VALUE | KEY_WOW64_64KEY標志(或其它標志具有組合KEY_WOW64_64KEY )在RegOpenKeyEx

如果您在64位操作系統下收到文件重定向的嚴重問題,可以在引導程序中調用Wow64DisableWow64FsRedirection (請參閱http://msdn.microsoft.com/en-us/library/aa365743.aspx )。

根據評論更新 :如果您希望MSI創建Software\\WOW6432Node\\DroidExplorer\\InstallPath密鑰(例如,您安裝了32位應用程序),則可以直接執行此操作。 因為Windows Installer應該在64位操作系統上運行,並且組件表中的條件使用VersionNT64屬性(如果需要,還可以是Msix64Intel64 )。

更新2考慮使用msidbComponentAttributesDisableRegistryReflection或/和msidbComponentAttributes64bit標志來創建具有您創建的注冊表項的組件。 此外,在摘要信息流中驗證您在Template Summaryx64;1033Intel;1033 )和Page Count Summary屬性(必須為200或更大)中使用的值。

唯一的方法是通過自定義操作。

您必須調用RegOpenKeyEx並將0x100設置為REGSAM samDesired參數以強制使用64位注冊表。 在此處查看RegOpenKeyEx。

您無法使用標准的.NET注冊表類來執行此操作。 如果使用.NET語言,則必須手動使用P / Invoke

通過提供兩個安裝程序可能會更好,一個用於64位,另一個用於32位。 這就是我們如何解決這個問題,因為它不那么復雜。

您必須使用Win64="No"參數將組件設置為Win32 否則,MSI將使用它運行的任何系統作為默認值(即,此類操作系統上的x64)。

例如:

<Component Id="C__mycomponent" Guid="MYGUID" Win64="No">
  <RegistryKey Root="HKLM" Key="Software\DroidExplorer\InstallPath" Action="createAndRemoveOnUninstall" />
</Component>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM