我想为仅针对当前用户安装的Shell扩展创建安装程序。我希望升级和卸载对于最终用户都尽可能无缝地运行。
问题在于,已加载的外壳扩展DLL可以被注销,但不能删除,因为它已被资源管理器锁定。尝试删除DLL时,安装程序将卡住。由于仅为当前用户安装了Shell扩展,因此我无法利用任何需要管理员特权的“重启时删除DLL”选项。我也不能使用强制重启explorer.exe,因为它可能会使最终用户的计算机处于无法使用的状态:重启重启资源管理器通常会关闭,但不会再次启动。
研究了其他一些应用程序的DLL之后,似乎有些人正在使用滚动版本号,例如shell_ext_v5.dll
,shell_ext_v6.dll
等。新版本获得了一个新编号,因此旧DLL文件可以不一定需要删除。
如果我采用这种策略:
所以不好的是,系统中将剩下DLL文件。但是,好处是,如果DLL被锁定,则安装/卸载将永远不会卡住。你怎么看?还有其他选择吗?
答案 0 :(得分:2)
编写一个小程序以删除系统上过时的文件(每个版本都添加到列表中)。
在应用程序更新时,将注册表项添加到HKCU\Software\Microsoft\Windows\RunOnce
,指向该程序。
下次用户登录时,将执行此程序(文件将被解锁并因此被删除),然后系统将从注册表中删除该条目。
确保程序的Main
函数返回0作为退出代码。
这对用户应该是透明的,并可能会闪烁一个控制台窗口(取决于程序设置)。
所有这些操作都是在用户上下文中执行的,因此不需要管理员权限或UAC。