升级/卸载Shell扩展最合理的策略?

时间:2019-05-01 17:23:35

标签: dll shell-extensions

我想为仅针对当前用户安装的Shell扩展创建安装程序。我希望升级和卸载对于最终用户都尽可能无缝地运行。

问题在于,已加载的外壳扩展DLL可以被注销,但不能删除,因为它已被资源管理器锁定。尝试删除DLL时,安装程​​序将卡住。由于仅为当前用户安装了Shell扩展,因此我无法利用任何需要管理员特权的“重启时删除DLL”选项。我也不能使用强制重启explorer.exe,因为它可能会使最终用户的计算机处于无法使用的状态:重启重启资源管理器通常会关闭,但不会再次启动。

研究了其他一些应用程序的DLL之后,似乎有些人正在使用滚动版本号,例如shell_ext_v5.dllshell_ext_v6.dll等。新版本获得了一个新编号,因此旧DLL文件可以不一定需要删除。

如果我采用这种策略:

  • 重新安装当前版本时,我可以保持DLL不变,因为它没有更改。
  • 升级时,将安装新的DLL,并且注册表将指向新版本。旧的DLL文件将保留在系统中,即使未使用。
  • 在卸载时,如果DLL文件被资源管理器锁定,则可能无法删除该文件。

所以不好的是,系统中将剩下DLL文件。但是,好处是,如果DLL被锁定,则安装/卸载将永远不会卡住。你怎么看?还有其他选择吗?

1 个答案:

答案 0 :(得分:2)

编写一个小程序以删除系统上过时的文件(每个版本都添加到列表中)。

在应用程序更新时,将注册表项添加到HKCU\Software\Microsoft\Windows\RunOnce,指向该程序。

下次用户登录时,将执行此程序(文件将被解锁并因此被删除),然后系统将从注册表中删除该条目。

确保程序的Main函数返回0作为退出代码。

这对用户应该是透明的,并可能会闪烁一个控制台窗口(取决于程序设置)。

所有这些操作都是在用户上下文中执行的,因此不需要管理员权限或UAC。