我有用 C++ 和 COM 编写的 shell 扩展 dll dll 被注册并加载到内存中。我的升级设置程序将执行以下操作:
- 注销shell扩展dll,杀死explorer.exe
- 复制更高版本的 shell 扩展 dll(第 2 步)
- 启动explorer.exe
效果很好。但问题是:
如果用户打开任何其他应用程序(Internet Explorer,有时是 Windows 任务管理器、记事本等),则步骤第 2 步 将失败。
有没有办法在升级 dll 时关闭所有 shell 扩展 dll Hook 。
在 dll 中,我使用 GetOverlayInfo、上下文菜单、数据库连接等
最佳答案
简单地说:不要这样做(即不要强制卸载它)。您必须枚举加载了 shell 扩展的所有进程,然后“重新启动”这些进程。坦率地说,这是非常具有侵略性的:不良行为(对于安装人员而言)。这还需要您的安装程序可能不需要的特殊权限。
大多数人似乎仍然没有意识到 MoveFile
(和 MoveFileEx
)可用于移动 DLL 或 EXE 文件当前正在由正在运行的应用程序使用。
这是 Windows Installer 所采用的方法。您是否注意到在安装一些 .msi
后给定驱动器根目录中的文件夹 \Config.msi
?该文件夹实际上包含(已移动并通常重命名为某个唯一的“临时”名称)已移出但当时仍在使用的原始文件。然后,通常会安排在启动时删除它们(MoveFileEx
和 MOVEFILE_DELAY_UNTIL_REBOOT
)。
您可以在自制安装程序中使用相同的机制,将正在使用的旧文件移出其原始位置,并立即将另一个文件移入。然后,任何新的应用程序实例都将使用新的 shell 扩展 (*),而旧的应用程序将继续由任何在某个时刻加载它的正在运行的应用程序使用。
(*) 我对此不是 100% 确定,因为适用于 DLL 加载的规则会阻止在某些情况下再次加载同名模块。
关于visual-studio-2010 - 如何正确卸载 C++ Shell 扩展 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11365944/