InstallScript - 覆盖默认的卸载程序?

时间:2018-06-04 13:43:29

标签: windows-installer installshield uninstaller installscript

我们公司使用Flexera InstallShield 2012(旧的,我知道),我目前正在创建一个InstallScript项目。一切都运行得很好,脚本正是我想要的。

然而,我目前正处于泡菜状态。 InstallScript具有OnUninstall内置函数,在使用-uninstall标志运行安装程序时会调用该函数。我编写了自定义卸载脚本来删除安装过程中安装的所有内容。

但显然InstallScript(或Windows Installer)会在Windows控制面板中转到Programs and Functions -> Uninstall时为其创建一个不同的卸载程序。

有没有办法用InstallScript操作这个“默认卸载程序”?

如果您需要更多信息,请发表评论,我将更新此帖。

谢谢!

2 个答案:

答案 0 :(得分:1)

我可以看到两个可供选择的选项......

  1. 正如您在使用OnUninstall参数运行安装时正确提及-uninst时所提到的那样。我怀疑Windows注册表项中缺少此参数。请看看......

    HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\{your_product_id}\UninstallString
    

    该键应具有字符串,以便在卸载模式下使用-uninst参数运行安装程序,以便设置为OnUninstall处理程序。如果未设置,您可能需要在首次注册产品时手动添加。

  2. 您可以使用OnEnd事件处理程序,它可以在安装结束时进行清理,并且会一直打到。在此事件处理程序中,您可以为删除产品执行特定的脚本编写。代码可能看起来像......

    function OnEnd()
        // local variables
    begin
        if (!MAINTENANCE) then
            // initial setup; you may fix the Windows uninstall registry here (see point #1)
        else
            if ( nMaintTypeGlobal = REMOVEALL ) then
                // product removal
            endif;
        endif;
    end;
    

答案 1 :(得分:0)

如果这是一个Installscript MSI项目,则Windows Installer本身会隐式包含自己的MSI卸载。

从理论上讲,根据你的工作方式,你自己应该几乎不需要实现自定义卸载逻辑 - 除非你做的事情非常不寻常

除非其他MSI文件在使用中注册了其他MSI文件,否或与旧版安装程序共享组件引用,方法是更新并注意使用次数:

  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\SharedDLLs
  • HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\SharedDLLs

(意味着将尊重从旧版安装程序计数的旧式引用 - 如果旧版安装程序已在使用中注册该文件,则不会卸载该资源)。

你在Uninstall event handler做了什么?