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

时间:2012-07-06 16:13:24

标签: visual-studio-2010 winapi visual-c++ shell-extensions

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

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

工作正常。但问题是:

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

升级dll时是否有办法关闭所有shell扩展dll挂钩。

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

2 个答案:

答案 0 :(得分:7)

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

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

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

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

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

答案 1 :(得分:1)

根据您的安装程序,您可以使用Windows Vista +中的Restart Manager支持。 这将允许您的设置查询正在使用您的DLL的每个应用程序,并尝试正常关闭它们。 如果它们不能,那么您需要在重新启动时注册它以进行更换。 设置完成后,Restart Manager将尝试重新启动它关闭的所有程序(支持重新启动)。