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