【发布时间】:2012-07-06 16:13:24
【问题描述】:
我有用 C++ 和 COM 编写的 shell 扩展 dll dll 被注册并加载到内存中。我的升级设置程序将执行以下操作:
- 注销shell扩展dll,杀死explorer.exe
- 复制更高版本的shell扩展dll(步骤2)
- 启动 explorer.exe
它工作正常。但问题是:
如果用户打开任何其他应用程序(Internet Explorer,有时是 Windows 任务管理器,记事本等),则步骤 步骤 2 将失败。
在升级 dll 时有什么方法可以关闭所有 shell 扩展 dll 挂钩。
在 dll 中我使用 GetOverlayInfo、上下文菜单、数据库连接等
【问题讨论】:
-
认为杀死
explorer.exe会有所帮助的想法是错误的。首先,这是一件非常具有侵略性的事情(Windows Installer 会将正在使用的文件 移动 到同一卷上的另一个位置以将新文件安装到原始位置),其次它可能不会完全可以工作,因为用户可能使用的是完全不同的文件管理器,它使用了 shell 扩展。我自己这样做,而做出这些假设的安装人员只是烦人。你可以远程关闭引用,造成各种破坏。不要这样做! -
我和@0xC0000022L 在一起。我和其他人一样讨厌重新启动,但我认为这需要一个。在资源管理器启动之前,您可以在系统再次启动时完成安装。
-
@eran:实际上只需要重启受影响的应用程序(或注销)。
-
您的外壳扩展 DLL 通过外壳对话框加载到其他进程中。就像在记事本中的文件 + 打开一样。您可以重命名原始 DLL 并将新的 DLL 安装到位,但需要注销才能使其生效。
-
@HansPassant:只是想知道,你知道这个问题的最终答案吗:新的应用程序实例会立即使用新的 shell 扩展吗?我不是 100% 确定。
标签: visual-studio-2010 winapi visual-c++ shell-extensions