WiX从注册表混淆中检索路径

时间:2016-05-20 14:04:00

标签: wix windows-installer

我正在尝试为我的一个应用程序的插件创建一个WiX安装程序但是遇到了一些我觉得很奇怪的东西;也许这是预期的行为,但后来我想知道原因。

我的应用程序将其安装路径保存在以下注册表位置:

HKEY_CURRENT_USER \ SOFTWARE \ MyCompany的\ MyApp的\安装

默认情况下,如果x64和C:\ Program Files(x86)\ MyApp(如果是x86),我的应用程序将安装到C:\ Program Files \ MyApp。

在我的插件安装程序中,我在Product.wxs中有以下内容来检索我的应用程序的安装路径:

<Property Id="MY_APP_DIR">
  <RegistrySearch Id='my_app_dir' Type='raw' Root='HKCU' Key='SOFTWARE\MyCompany\MyApp' Name='Installed' />
</Property>

然后我添加了以下内容,以查看运行安装程序时实际检索到的内容:

<Condition Message="[MY_APP_DIR]">
  0  
</Condition>

如果“C:\ Program Files \ MyApp \”存储在注册表中,我在运行插件安装程序时得到以下内容:

插件安装程序(x86):C:\ Program Files(x86)\ MyApp \

插件安装程序(x64):C:\ Program Files \ MyApp \

为什么注册表中存储的值不是独立于为msi构建的平台而检索的?

在x64机器上,只会使用x64版本的安装程序,所以这不会引起任何问题,只会让我感到困惑。

编辑:根据要求,我已经包含了我的整个Product.wxs:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Product Id="*" Name="TestInstaller" Language="1033" Version="1.0.0.0" Manufacturer="MyCompany" UpgradeCode="SOME_GUID">
    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />

    <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
    <MediaTemplate EmbedCab="yes" />

    <Property Id="MY_APP_DIR">
        <RegistrySearch Id="my_app_dir" Root="HKCU" Key="SOFTWARE\MyCompany\MyApp" Name="Installed" Type="raw" />
    </Property>

    <Condition Message="[MY_APP_DIR]">
        0
    </Condition>

    <Feature Id="ProductFeature" Title="TestInstaller" Level="1">
        <ComponentGroupRef Id="ProductComponents" />
    </Feature>
  </Product>

  <Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="INSTALLFOLDER" Name="TestInstaller">
      <Directory Id="MY_APP_DIR" Name="MyAppInstallPath">
        <Directory Id="MyAppBinFolder" Name="bin" />
      </Directory>
    </Directory>
    </Directory>
  </Fragment>
  <Fragment>
    <ComponentGroup Id="ProductComponents">
      <Component Id="ProductComponent" Guid="SOME_GUID" Directory="MyAppBinFolder">
        <File Id="Foo.Bar" Source="Foo.Bar" KeyPath="yes" />
      </Component>
    </ComponentGroup>
  </Fragment>
</Wix>

1 个答案:

答案 0 :(得分:1)

Windows Installer有一个名为WIN64DUALFOLDERS的规则,它不允许32位安装程序写入64位位置。如果在启用了诊断日志记录的64位计算机上运行32位安装程序,则应在日志文件中看到如下所示的部分:

AppSearch: Property: MY_APP_DIR, Signature: my_app_dir
MSI (c) (BC:F4) [10:00:47:953]: Note: 1: 2262 2: Signature 3: -2147287038 
MSI (c) (BC:F4) [10:00:47:953]: WIN64DUALFOLDERS: 'C:\Program Files (x86)\' will substitute 17 characters in 'C:\Program Files\MyCompany\MyApp' folder path. (mask argument = 0, the folder pair's iSwapAttrib member = 0).
MSI (c) (BC:F4) [10:00:47:953]: PROPERTY CHANGE: Adding MY_APP_DIR property. Its value is 'C:\Program Files (x86)\MyCompany\MyApp'.
Action ended 10:00:47: AppSearch. Return value 1.

即使注册表中的路径为C:\Program Files\,Windows Installer也会自动将其重定向到C:\Program Files (x86)\

有关详细信息,请参阅Disable WIN64DUALFOLDERS substitution in WIX

注意:我删除了之前的答案,因为事后看来它没用。