代码之家  ›  专栏  ›  技术社区  ›  Ryan Conrad

为什么Windows Vista x64上的x86 Wix安装程序不将密钥写入注册表中的wow6432节点?

  •  6
  • Ryan Conrad  · 技术社区  · 15 年前

    我有一个安装程序 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 .

    如果我不强制告诉安装程序写入WOW6432节点,它会将值写入 软件\droidexplorer\installpath ,但引导程序仍尝试在wow6432节点中查找,因为 registry reflection . 这在所有X64系统上。

    为什么只有Windows Vista x64有此问题?有办法解决这个问题吗?

    我只想添加一个仍然打开的编辑。下面的建议都还没有解决这个问题。

    4 回复  |  直到 10 年前
        1
  •  2
  •   Peter Mortensen Pieter Jan Bonestroo    10 年前

    事实上,Windows Vista x64上的注册表重定向失败是非常奇怪的,因为根据msdn, Registry Redirector ,Windows Vista也应该受到影响。

    另一个答案中的评论,“ 当我构建安装在x64 pfiles中的应用程序的x64版本时,这不起作用,它告诉我正在使用64位安装目录,并且不允许win64=no “让我有点困惑,你正在建立什么类型的微星。

    注册表重定向只会影响MSI中的32位组件。如果wix项目的目标平台是x86,则生成的msi是32位msi,并且所有组件都将受到注册表重定向的影响。

    另一方面,如果wix项目的目标平台是x64,那么受注册表重定向影响的唯一组件将是那些显式标记为win64=no的组件(默认情况下,如果目标平台是x64,wix假定所有组件都是64位的)。

    注意,如果注册表项的组件包含在programfiles64文件夹中,那么wix将假定它是64位组件,并且不会受到注册表重定向的影响。这就是wix不允许您在该组件上指定win64=no的原因。

    您应该验证是否将包含要重定向的注册表项的每个组件配置为使用程序文件(32位),因为它是x86和x64 msi文件中的父目录。

        2
  •  1
  •   Oleg    15 年前

    可能需要更改32位引导程序的代码。您应该测试应用程序是否在64位操作系统下运行,例如 IsWow64Process 函数(见) http://msdn.microsoft.com/en-us/library/ms684139.aspx )如果操作系统是64位的,则应使用 KEY_QUERY_VALUE | KEY_WOW64_64KEY 标志(或其他标志与 KEY_WOW64_64KEY RegOpenKeyEx .

    如果在64位操作系统下收到文件重定向的关闭问题,可以调用 Wow64DisableWow64FsRedirection 在引导程序中(请参见 http://msdn.microsoft.com/en-us/library/aa365743.aspx )

    更新的 根据评论:如果你想要的话 Software\WOW6432Node\DroidExplorer\InstallPath 密钥将由MSI创建(例如,您安装的是32位应用程序),您可以直接执行此操作。原因是Windows Installer应该在组件表中条件为的64位操作系统上运行,使用 VersionNT64 财产(或) Msix64 Intel64 如果需要的话)。

    更新2 考虑使用 msidbComponentAttributesDisableRegistryReflection 或/和 msidbComponentAttributes64bit 带有您创建的注册表项的组件的标志。此外,还要验证您在 Template Summary ( x64;1033 Intel;1033 ) Page Count Summary 摘要信息流中的属性(必须大于或等于200)。

        3
  •  0
  •   Peter Mortensen Pieter Jan Bonestroo    10 年前

    唯一的方法是通过自定义操作。

    您必须调用regopenkeyex并将0x100设置为regsam samdesired参数以强制使用64位注册表。见RegOpenKeyEx here .

    不能使用标准的.NET注册表类来执行此操作。您必须手动使用 P/Invoke 如果使用.NET语言。

    您最好提供两个安装程序,一个用于64位,一个用于32位。这就是我们如何解决这个问题,因为它不那么复杂。

        4
  •  -1
  •   Peter Mortensen Pieter Jan Bonestroo    10 年前

    必须将组件设置为 Win32 ,使用 Win64="No" 参数。否则,msi将使用其运行的任何系统作为默认系统(即,在此类操作系统上使用x64)。

    例如:

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