在发布的MSI中,我有硬编码的端口号,例如
<Property Id="HTTP_PORT1" Secure="yes" Value="1000" />
<Component Id="my.exe" Guid="*" Win64="yes" >
<File Id="my.exe" KeyPath="yes" Source="my.exe" />
<RegistryValue Root="HKLM" Key="SOFTWARE\MyCompany" Name="Port1" Value="[HTTP_PORT1]" Type="integer" />
<RegistryValue Root="HKLM" Key="SOFTWARE\MyCompany" Name="Port2" Value="9000" Type="integer" />
</Component>
对于补丁,我的Patch.wxs看起来像这样:
<PatchFamily Id="Rollup" Version="1.0.100" Supersede="yes">
<ComponentRef Id="my.exe"/>
</PatchFamily>
当我手动将这些注册表更改为&#34; 1111&#34;和&#34; 9999&#34;并应用补丁MSP,那些Port1和Port2被设置回&#34; 1000&#34;和&#34; 9000&#34;分别。所以我改变了#34; HTTP_PORT1&#34;并添加&#34; INT_HTTP_PORT2&#34;像这样:
<Property Id="HTTP_PORT1" Secure="yes" Value="#1000" >
<RegistrySearch Root="HKLM" Key="SOFTWARE\MyCompany" Name="Port1" Type="raw" Win64="yes" />
</Property>
<Property Id="INT_HTTP_PORT2" Secure="yes" Value="#9000" >
<RegistrySearch Root="HKLM" Key="SOFTWARE\MyCompany" Name="Port2" Type="raw" Win64="yes" />
</Property>
<Component Id="my.exe" Guid="*" Win64="yes" >
<File Id="my.exe" KeyPath="yes" Source="my.exe" />
<RegistryValue Root="HKLM" Key="SOFTWARE\MyCompany" Name="Port1" Value="[HTTP_PORT1]" Type="string" />
<RegistryValue Root="HKLM" Key="SOFTWARE\MyCompany" Name="Port2" Value="[INT_HTTP_PORT2]" Type="string" />
</Component>
我改变了像这样的Patch.wxs:
<PatchFamily Id="Rollup" Version="1.0.100" Supersede="yes">
<ComponentRef Id="my.exe"/>
<PropertyRef Id="HTTP_PORT1"/>
<PropertyRef Id="INT_HTTP_PORT2"/>
</PatchFamily>
但是,Port1和Port2都会更改回原始值(尽管Port1现在是REG_SZ。) 这是预期的行为吗?是否可以在不使用Type1自定义操作的情况下使其在补丁中工作?
答案 0 :(得分:0)
该组件中的可执行文件是keypath项。我验证您是否增加了该exe的版本,因为它有效地控制了该组件是否更新。您可以创建补丁安装的详细日志,以确切了解正在进行的操作。
在详细日志中需要查找的内容是它对my.exe的描述,是否覆盖了其他内容。另请注意,如果修补程序中的组件规则被破坏,则实际上将导致无法修补任何内容。如果是这种情况,您将在日志中看到SELMGR。