检查 DLL 是否被另一个应用程序使用
Check whether the DLL is used by another application
我正在通过我的安装程序注册 capicom.dll
并在卸载我的产品时注销它。还有一个第三方软件"ABC",也注册并使用了这个DLL。
但问题是,当我卸载自己的产品时,我注销了 capicom.dll。因此,另一个第三方软件 "ABC" 无法正常工作。
那么如何在取消注册时检查此 DLL 是否被另一个 product/application 使用?
这个问题没有 100% 的好答案。根据正在使用的底层技术,有各种约定试图解决相关问题。其中包括:
- 跟踪引用计数的 SharedDLLs 注册表项
- Windows 安装程序组件计数(如果多个 .msi 包安装相同的组件,例如来自合并模块)
- 其他包级参考方案
- 从不从系统文件夹中卸载
但是,这些仅在给定文件只有一个位置时才有效。在您的情况下,从字里行间来看,我怀疑 capicom.dll 有多个文件位置,但其 COM 注册只有一个注册表位置。因此,当您安装副本时,您可能会覆盖现有的 COM 注册。当您的副本就位时,一切都很好。但是当您删除您的副本时,and/or取消注册它,COM 注册不会恢复到以前的副本。
假设您不能确保只有 capicom.dll 的单个文件副本,我能想到的最佳选择是在引用 [=28] 的私有副本的可执行文件上使用 registration-free COM manifest =],并跳过注册 capicom.dll 的私人副本。 InstallShield 可以帮助您创建外部清单,或者您可以自己创建清单并将其嵌入到您的可执行文件中。如果您自己公开需要加载 capicom 的 inproc COM 服务器,请特别注意验证激活上下文是否有效。
我正在通过我的安装程序注册 capicom.dll
并在卸载我的产品时注销它。还有一个第三方软件"ABC",也注册并使用了这个DLL。
但问题是,当我卸载自己的产品时,我注销了 capicom.dll。因此,另一个第三方软件 "ABC" 无法正常工作。 那么如何在取消注册时检查此 DLL 是否被另一个 product/application 使用?
这个问题没有 100% 的好答案。根据正在使用的底层技术,有各种约定试图解决相关问题。其中包括:
- 跟踪引用计数的 SharedDLLs 注册表项
- Windows 安装程序组件计数(如果多个 .msi 包安装相同的组件,例如来自合并模块)
- 其他包级参考方案
- 从不从系统文件夹中卸载
但是,这些仅在给定文件只有一个位置时才有效。在您的情况下,从字里行间来看,我怀疑 capicom.dll 有多个文件位置,但其 COM 注册只有一个注册表位置。因此,当您安装副本时,您可能会覆盖现有的 COM 注册。当您的副本就位时,一切都很好。但是当您删除您的副本时,and/or取消注册它,COM 注册不会恢复到以前的副本。
假设您不能确保只有 capicom.dll 的单个文件副本,我能想到的最佳选择是在引用 [=28] 的私有副本的可执行文件上使用 registration-free COM manifest =],并跳过注册 capicom.dll 的私人副本。 InstallShield 可以帮助您创建外部清单,或者您可以自己创建清单并将其嵌入到您的可执行文件中。如果您自己公开需要加载 capicom 的 inproc COM 服务器,请特别注意验证激活上下文是否有效。