Inno Setup - 在安装过程中注销共享 DLL
Inno Setup - Unregister shared DLL during installation
另请参阅:
Inno Setup: How to automatically uninstall previous installed version?
在我的 Inno Setup 脚本的 [Files] 部分,我有一行:
Source: {#InstallSource}\OldDll.dll; DestDir: {sys}; Flags: sharedfile regserver
应用程序的更新版本不再使用此 DLL。我想在安装新版本时做的是减少此 DLL 的共享文件锁定计数,如果为零,则取消注册并删除它。
最简单的方法是告诉用户在更新前卸载之前版本的应用程序,但这将意味着各种配置设置也将被删除,用户将不得不重新输入它们手动。是否可以使 DLL unregistration/deletion 过程自动化?
虽然您可以这样做来注销和卸载 DLL:
- 呼叫
DecrementSharedCount
;
- 如果 returns 为真,则取消注册共享 DLL
UnregisterServer
and delete it with DeleteFile
。
... 它实际上会破坏引用计数,因为它不会阻止您的卸载程序再次减少引用计数器。这是因为卸载程序 remembers actions of all past versions of the installer 并将处理它们。
示例:如果您的 DLL 由您的应用程序和另一个应用程序共享 - 2 个引用。您 运行 您的更新,它将计数器减少到 1。然后您卸载您的应用程序,这将计数器减少到 0 并删除 DLL => 另一个应用程序中断。
所以最后唯一真正正确的解决方案是 运行 卸载程序,在安装程序的开头。
见Inno Setup: How to automatically uninstall previous installed version?
您只能有条件地执行此操作,当共享文件仍然存在时。
不过,事实证明您并不需要通过新版本的安装程序卸载共享 DLL。您只担心当新安装程序不再安装共享 DLL 时,其卸载程序也不会正确卸载它。但它会的,正是由于第一节中提到的原因。
另请参阅:
Inno Setup: How to automatically uninstall previous installed version?
在我的 Inno Setup 脚本的 [Files] 部分,我有一行:
Source: {#InstallSource}\OldDll.dll; DestDir: {sys}; Flags: sharedfile regserver
应用程序的更新版本不再使用此 DLL。我想在安装新版本时做的是减少此 DLL 的共享文件锁定计数,如果为零,则取消注册并删除它。
最简单的方法是告诉用户在更新前卸载之前版本的应用程序,但这将意味着各种配置设置也将被删除,用户将不得不重新输入它们手动。是否可以使 DLL unregistration/deletion 过程自动化?
虽然您可以这样做来注销和卸载 DLL:
- 呼叫
DecrementSharedCount
; - 如果 returns 为真,则取消注册共享 DLL
UnregisterServer
and delete it withDeleteFile
。
... 它实际上会破坏引用计数,因为它不会阻止您的卸载程序再次减少引用计数器。这是因为卸载程序 remembers actions of all past versions of the installer 并将处理它们。
示例:如果您的 DLL 由您的应用程序和另一个应用程序共享 - 2 个引用。您 运行 您的更新,它将计数器减少到 1。然后您卸载您的应用程序,这将计数器减少到 0 并删除 DLL => 另一个应用程序中断。
所以最后唯一真正正确的解决方案是 运行 卸载程序,在安装程序的开头。
见Inno Setup: How to automatically uninstall previous installed version?
您只能有条件地执行此操作,当共享文件仍然存在时。
不过,事实证明您并不需要通过新版本的安装程序卸载共享 DLL。您只担心当新安装程序不再安装共享 DLL 时,其卸载程序也不会正确卸载它。但它会的,正是由于第一节中提到的原因。