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