InstallScript - 覆盖默认卸载程序?
Posted
技术标签:
【中文标题】InstallScript - 覆盖默认卸载程序?【英文标题】:InstallScript - Overwrite the default uninstaller? 【发布时间】:2018-11-13 21:02:55 【问题描述】:我们公司使用 Flexera InstallShield 2012(旧的,我知道),我目前正在创建一个 InstallScript 项目。一切运行良好,脚本完全按照我的意愿运行。
但是,我目前处于泡菜状态。 InstallScript 具有OnUninstall
内置函数,当使用-uninstall
标志运行安装程序时会调用该函数。我已经编写了自定义卸载脚本来删除我在安装过程中安装的所有内容。
但显然InstallScript
(或 Windows 安装程序)会为您在 Windows 控制面板中转到 Programs and Functions -> Uninstall
时创建一个不同的卸载程序。
有什么方法可以用InstallScript
操作这个“默认卸载程序”吗?
如果您需要更多信息,请发表评论,我会更新这篇文章。
谢谢!
【问题讨论】:
您能说一下您要解决的问题吗?显然你已经决定你有一个解决方案(操纵默认卸载程序?)但是你正在处理什么问题?请注意,没有实际的默认卸载程序(除非您想制作一个?),因为 Windows 只是调用 API 将产品配置为不存在 - 它不会调用单独的程序。 @PhilDW 我已经实现了一个自定义 OnUninstall 函数,但是当我使用 Windows 程序和应用程序面板中的构建卸载我的程序时它不会被调用。 【参考方案1】:我可以看到两个可供您尝试的选项...
正如您正确提到的那样,在使用-uninst
参数运行安装时调用了OnUninstall
。我怀疑 Windows 注册表项中缺少此参数。请看...
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\your_product_id\UninstallString
该键应该有字符串以在卸载模式下运行安装程序并带有-uninst
参数,以便安装程序命中OnUninstall
处理程序。如果未设置,您可能需要在初次注册产品时手动添加。
您可以使用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;
【讨论】:
当我回到办公室时(星期四)我会试试这个。谢谢!【参考方案2】:如果这是一个 Installscript MSI
项目,那么它自己的 Windows Installer
卸载隐式包含在 MSI
本身中。
理论上,根据您的操作方式,几乎不需要自己实现自定义卸载逻辑 - 除非您正在做一些非常不寻常的事情。
应正确卸载所有随 MSI 组件添加的文件和注册表项,除非其他 MSI 文件已注册使用它们,或者您已将组件设置为永久或与旧版安装程序共享通过在此处更新和注意使用计数来引用组件:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\SharedDLLs
HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\SharedDLLs
(意味着将遵守旧版安装程序的旧式引用计数 - 如果旧版安装程序已注册使用的文件,则不会卸载资源)。
你在 Uninstall event handler
里做什么?
【讨论】:
否定,它是一个 InstallScript 项目,而不是一个 InstallScript MSI 项目。以上是关于InstallScript - 覆盖默认卸载程序?的主要内容,如果未能解决你的问题,请参考以下文章