Wix 安装程序在更新时使用默认的应用程序路径,而不是预期的来自注册表
Wix setup uses default Application path on Update and not from registry as expected
我们正在使用 Wix Toolset V3.11 来构建我们的设置。
因为下面的声明,我们默认的安装路径是C:/Program Files(x86)/Acme/AppName
。
<Property Id="ApplicationFolderName" Value="$(var.Manufacturer)$(var.AppFolderName)" />
<Property Id="WixAppFolder" Value="WixPerMachineFolder" />
通过设置中的 'Advanced' 按钮,我们将此路径更改为 C:/Program Files(x86)/Acme/FooBar
:
以下声明将更改后的路径保存在注册表中:
<RegistryKey
Key="Software$(var.Manufacturer)$(var.AppName)"
Root="HKLM">
<RegistryValue Id="InstallationRegistry"
Type="string"
Name="InstallDir"
Value="[APPLICATIONFOLDER]" />
</RegistryKey>
通过 Regedit.exe 我可以在注册表中看到路径 C:/Program Files(x86)/Acme/FooBar
,正如预期的那样。一切都好。
问题: 但是现在,当我 运行 一个更新的新设置时,所有文件都已从自定义文件夹中移出 C:/Program Files(x86)/Acme/FooBar
到默认文件夹 C:/Program Files(x86)/Acme/AppName
.
当我执行更新并单击 'Advanced' 按钮时,默认路径 C:/Program Files(x86)/Acme/AppName
被预先分配:
我使用以下标记从注册表中查询路径:
<Property Id="APPLICATIONFOLDER">
<RegistrySearch Id='InstallationRegistrySearch' Type='raw' Root='HKLM' Key='Software$(var.Manufacturer)$(var.AppName)' Name='InstallDir' />
</Property>
这是相关的标记:
<Fragment>
<ComponentGroup Id="RootComponents" Directory="APPLICATIONFOLDER">
<Component Id="RootComponent" Guid="xxxxxxxxx" Win64='yes'>
<RegistryKey
Key="Software$(var.Manufacturer)$(var.AppName)"
Root="HKLM">
<RegistryValue Id="InstallationRegistry"
Type="string"
Name="InstallDir"
Value="[APPLICATIONFOLDER]" />
</RegistryKey>
</Component>
</ComponentGroup>
[...]
<Product ...>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="PROGRAMFILESPATH" Name="$(var.ProgramFilesPath)">
<Directory Id="ManufacturerFolder" Name="$(var.Manufacturer)">
<Directory Id="APPLICATIONFOLDER" Name="$(var.AppFolderName)" >
<!-- here are the application files (e.g. Appname.exe)-->
[...]
</Directory>
</Directory>
</Directory>
</Directory>
[...]
<Property Id="ApplicationFolderName" Value="$(var.Manufacturer)$(var.AppFolderName)" />
<Property Id="WixAppFolder" Value="WixPerMachineFolder" />
<Property Id="APPLICATIONFOLDER">
<RegistrySearch Id='InstallationRegistrySearch' Type='raw' Root='HKLM' Key='Software$(var.Manufacturer)$(var.AppName)' Name='InstallDir' />
</Property>
<Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
<Property Id="ALLUSERS" Value="1"/>
[...]
<UI>
[...]
<UIRef Id="WixUI_Advanced"/>
</UI>
</Product>
我们做错了什么?
记住属性:属性 值不会被 MSI 自动神奇地保留,因此需要模式,例如“Remember Property Pattern”。
Bitness: 看起来你正在从注册表中读回,但会不会是你有一个“位数问题”?换句话说,您是从注册表的 x64-section 而不是 x86-section 读取的? (反之亦然)。
HKEY_LOCAL_MACHINE\SOFTWARE\Manufacturer\Acme\Program
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Manufacturer\Acme\Program
我们正在使用 Wix Toolset V3.11 来构建我们的设置。
因为下面的声明,我们默认的安装路径是C:/Program Files(x86)/Acme/AppName
。
<Property Id="ApplicationFolderName" Value="$(var.Manufacturer)$(var.AppFolderName)" />
<Property Id="WixAppFolder" Value="WixPerMachineFolder" />
通过设置中的 'Advanced' 按钮,我们将此路径更改为 C:/Program Files(x86)/Acme/FooBar
:
以下声明将更改后的路径保存在注册表中:
<RegistryKey
Key="Software$(var.Manufacturer)$(var.AppName)"
Root="HKLM">
<RegistryValue Id="InstallationRegistry"
Type="string"
Name="InstallDir"
Value="[APPLICATIONFOLDER]" />
</RegistryKey>
通过 Regedit.exe 我可以在注册表中看到路径 C:/Program Files(x86)/Acme/FooBar
,正如预期的那样。一切都好。
问题: 但是现在,当我 运行 一个更新的新设置时,所有文件都已从自定义文件夹中移出 C:/Program Files(x86)/Acme/FooBar
到默认文件夹 C:/Program Files(x86)/Acme/AppName
.
当我执行更新并单击 'Advanced' 按钮时,默认路径 C:/Program Files(x86)/Acme/AppName
被预先分配:
我使用以下标记从注册表中查询路径:
<Property Id="APPLICATIONFOLDER">
<RegistrySearch Id='InstallationRegistrySearch' Type='raw' Root='HKLM' Key='Software$(var.Manufacturer)$(var.AppName)' Name='InstallDir' />
</Property>
这是相关的标记:
<Fragment>
<ComponentGroup Id="RootComponents" Directory="APPLICATIONFOLDER">
<Component Id="RootComponent" Guid="xxxxxxxxx" Win64='yes'>
<RegistryKey
Key="Software$(var.Manufacturer)$(var.AppName)"
Root="HKLM">
<RegistryValue Id="InstallationRegistry"
Type="string"
Name="InstallDir"
Value="[APPLICATIONFOLDER]" />
</RegistryKey>
</Component>
</ComponentGroup>
[...]
<Product ...>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="PROGRAMFILESPATH" Name="$(var.ProgramFilesPath)">
<Directory Id="ManufacturerFolder" Name="$(var.Manufacturer)">
<Directory Id="APPLICATIONFOLDER" Name="$(var.AppFolderName)" >
<!-- here are the application files (e.g. Appname.exe)-->
[...]
</Directory>
</Directory>
</Directory>
</Directory>
[...]
<Property Id="ApplicationFolderName" Value="$(var.Manufacturer)$(var.AppFolderName)" />
<Property Id="WixAppFolder" Value="WixPerMachineFolder" />
<Property Id="APPLICATIONFOLDER">
<RegistrySearch Id='InstallationRegistrySearch' Type='raw' Root='HKLM' Key='Software$(var.Manufacturer)$(var.AppName)' Name='InstallDir' />
</Property>
<Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
<Property Id="ALLUSERS" Value="1"/>
[...]
<UI>
[...]
<UIRef Id="WixUI_Advanced"/>
</UI>
</Product>
我们做错了什么?
记住属性:属性 值不会被 MSI 自动神奇地保留,因此需要模式,例如“Remember Property Pattern”。
Bitness: 看起来你正在从注册表中读回,但会不会是你有一个“位数问题”?换句话说,您是从注册表的 x64-section 而不是 x86-section 读取的? (反之亦然)。
HKEY_LOCAL_MACHINE\SOFTWARE\Manufacturer\Acme\Program
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Manufacturer\Acme\Program