我正在尝试为我的一个应用程序的插件创建一个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>
答案 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。
注意:我删除了之前的答案,因为事后看来它没用。