微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MSI InstallFinalize ARP删除条件

如何解决MSI InstallFinalize ARP删除条件

我正在尝试配置WiX以构建安装程序,以便我可以通过命令行提供的属性激活功能并将其迁移到下一个升级

尝试使用WiX安装程序进行MajorUpgrade升级时,不会从ARP-Menü中删除以前的版本。重新安装之前,似乎已删除了所有其他功能部件/组件(日志列出了它们)。仅当我通过命令行提供的属性激活了先前版本中的功能时,才会出现此问题。

v1的ARP条目已删除

msiexec /L*v install.log /i installerv1.msi
msiexec /L*v install.log /i installerv2.msi

v1的ARP条目不会被删除

msiexec /L*v install.log /i installerv1.msi EXTRAFEATURE=true
msiexec /L*v install.log /i installerv2.msi EXTRAFEATURE=true

或者

msiexec /L*v install.log /i installerv1.msi EXTRAFEATURE=true
msiexec /L*v install.log /i installerv2.msi

(v1和v2之间的ProductCode,PackageCode和Product Version不同,UpgradeCode保持不变)

简化的WiX配置:

<Product Id="$(var.CPACK_WIX_PRODUCT_GUID)"
    Name="$(var.CPACK_PACKAGE_NAME)"
    Language="1031"
    Version="$(var.CPACK_PACKAGE_VERSION)"
    Manufacturer="$(var.CPACK_PACKAGE_vendOR)"
    UpgradeCode="$(var.CPACK_WIX_UPGRADE_GUID)">
    
    <Package InstallerVersion="301"
        InstallScope="perMachine"
        Compressed="yes"
        Description="$(var.CPACK_PACKAGE_NAME)"
        Keywords="!(loc.PackageKeywords)"
        Comments="!(loc.PackageComments)"/>

    <MajorUpgrade
        Schedule="afterInstallValidate"
        AllowSameVersionUpgrades="yes"
        DowngradeErrorMessage="!(loc.DowngradeErrorMessage)"/>

    <FeatureRef Id="ProductFeature"/>
    <FeatureRef Id="ExtraFeature"/>

    <Property Id="EXTRAFEATURE" Secure="yes"/>
    <Feature Id="ExtraFeature" Level="0">
        <Condition Level="1">EXTRAFEATURE</Condition>
        <ComponentRef Id="ExtraFeature"/>
    </Feature>
    
    ...
</Product>

查看日志,我只会看到一个区别:InstallInitialize步骤不会触发生成删除ARP条目的脚本。

工作示例:

MSI (s) (14:10) [10:24:20:422]: Doing action: InstallInitialize
Aktion 10:24:20: InstallInitialize. 
Aktion gestartet um 10:24:20: InstallInitialize.
MSI (s) (14:10) [10:24:20:423]: Machine policy value 'AlwaysInstallElevated' is 0
MSI (s) (14:10) [10:24:20:423]: User policy value 'AlwaysInstallElevated' is 0
Aktion 10:24:20: GenerateScript. Für folgende Aktion werden Skriptvorgänge generiert:
GenerateScript: InstallInitialize
MSI (s) (14:10) [10:24:20:429]: PROPERTY CHANGE: Deleting ProductToBeRegistered property. Its current value is '1'.
MSI (s) (14:10) [10:24:20:430]: Note: 1: 2205 2:  3: Class 
MSI (s) (14:10) [10:24:20:430]: Note: 1: 2228 2:  3: Class 4: SELECT `CLSID` FROM `Class` WHERE `Icon_`=? AND `Class`.`Attributes`=1 
MSI (s) (14:10) [10:24:20:430]: Note: 1: 2205 2:  3: Class 
MSI (s) (14:10) [10:24:20:430]: Note: 1: 2228 2:  3: Class 4: SELECT `Component`,`CLSID` FROM `Component`,`Class` WHERE `Component`=`Component_` AND `Icon_`=? AND  (`Component`.`Installed` <> 0 AND `Component`.`Action` <> 0) 
MSI (s) (14:10) [10:24:20:430]: Note: 1: 2205 2:  3: Extension 
MSI (s) (14:10) [10:24:20:430]: Note: 1: 2228 2:  3: Extension 4: SELECT `Component`,`Extension` FROM `Component`,`Extension`,`ProgId` WHERE `Component`.`Component`=`Extension`.`Component_` AND `ProgId`.`ProgId`=`Extension`.`ProgId_` AND `ProgId`.`Icon_`=? AND  (`Component`.`Installed` <> 0 AND `Component`.`Action` <> 0) 
MSI (s) (14:10) [10:24:20:430]: 'ProductIcon.ico' icon will be removed.
Aktion beendet um 10:24:20: InstallInitialize. Rückgabewert 1.

不起作用的示例:

MSI (s) (74:94) [09:50:04:656]: Doing action: InstallInitialize
Aktion 09:50:04: InstallInitialize. 
Aktion gestartet um 09:50:04: InstallInitialize.
MSI (s) (74:94) [09:50:04:658]: Machine policy value 'AlwaysInstallElevated' is 0
MSI (s) (74:94) [09:50:04:658]: User policy value 'AlwaysInstallElevated' is 0
Aktion beendet um 09:50:04: InstallInitialize. Rückgabewert 1.

在InstallFinalize(https://docs.microsoft.com/en-us/windows/win32/msi/installfinalize-action)的文档中,我找到了以下描述:

如果检测到产品已标记为已完全删除,则会将操作自动添加到脚本中,以删除产品“控制面板”信息中的“添加/删除程序”,以取消注册和取消发布产品,并删除产品。从%WINDOWS%缓存本地数据库(如果存在)。

当ARP条目被删除时,我找不到有关此状况的任何文档。为什么添加功能会阻止触发ARP删除

解决方法

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。