visual-studio-2010 - 如何正确卸载 C++ Shell 扩展 DLL

标签 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 Hook 。

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

最佳答案

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

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

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

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

(*) 我对此不是 100% 确定,因为适用于 DLL 加载的规则会阻止在某些情况下再次加载同名模块。

关于visual-studio-2010 - 如何正确卸载 C++ Shell 扩展 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11365944/

相关文章:

c++ - 递归文件搜索

c - 套接字和 Win32api

c++ - Critical Section 对象如何适用于多种方法

从文件到 8 位字符到文件的 C++ 32 位整数-程序在某个整数处崩溃

c++ - 如何创建一个 unordered_set 的 shared_ptr 对象?

ASP.NET 站点通过 SSL 从 Visual Studio 而不是 IIS 连接到远程

visual-studio-2010 - 以 Azure 提升权限运行 Visual Studio : any way to avoid the side effects?

.net - 按 ctrl+space 时 Visual Studio 显示文档

.net - 在 Visual Studio 中处理 VB.NET Linq 格式?

visual-c++ - <msbuild/> 任务失败而 <devenv/> 在 CruiseControl.NET 中的 MFC 应用程序成功?