如何正确卸载C++ Shell扩展DLL

JCh*_*han 7 winapi shell-extensions visual-studio-2010 visual-c++

有用 C++和COM编写的shell扩展dll dll已注册并加载到内存中.我的升级安装程序将执行以下操作:

  • 取消注册shell扩展dll,终止explorer.exe
  • 复制shell扩展dll的更高版本(步骤2)
  • 启动explorer.exe

它工作正常.但问题是:

如果用户打开了任何其他应用程序(Internet Explorer,有时是Windows任务管理器,记事本等),则步骤2失败.

有没有办法在升级DLL时关闭所有shell扩展DLL挂钩.

在dll我使用GetOverlayInfo,上下文菜单,数据库连接等

0xC*_*22L 7

简单地说:不要这样做(即不要强行卸下它).您必须枚举加载了shell扩展的所有进程,然后"重新启动"它们.这是非常具有侵略性的,坦率地说:不良行为(对于安装人员而言).这还需要您的安装程序可能不需要的特定权限.

大多数人似乎还没有意识到的是MoveFile(和MoveFileEx)可用于移动当前正在运行的应用程序使用的DLL或EXE文件.

这是Windows Installer采用的方法.\Config.msi安装一些驱动程序后,您是否注意到给定驱动器根目录中的文件夹.msi?此文件夹实际上包含(移动并通常重命名为某个唯一的"临时"名称)已移出但当时仍在使用的原始文件.然后通常会在启动(MoveFileExwith MOVEFILE_DELAY_UNTIL_REBOOT)时安排删除它们.

您可以在自制软件安装程序中使用相同的机制,并将正在使用的旧文件移出其原始位置,然后立即移动另一个文件.然后,任何新的应用程序实例都将使用新的shell扩展(*),而旧的应用程序实例将继续被任何正在运行的应用程序使用,这些应用程序在某个时刻加载它.

(*)由于适用于DLL加载的规则并且在某些情况下会再次加载具有相同名称的模块,因此我不能100%确定这一点.