【发布时间】:2019-05-01 17:23:34
【问题描述】:
我想为仅为当前用户安装的 shell 扩展创建安装程序。我希望升级和卸载都尽可能为最终用户无缝运行。
问题是加载的外壳扩展 DLL 可以取消注册但不能删除,因为它被资源管理器锁定。安装程序在尝试删除 DLL 时会卡住。由于仅为当前用户安装了 shell 扩展,因此我无法利用任何需要管理员权限的“重启时删除 DLL”选项。我也不能使用 explorer.exe 的硬重启,因为它可能会使计算机处于最终用户无法使用的状态:通常重启时 explorer 会关闭但不会再次启动。
查看其他应用程序的 DLL 后,似乎有些应用程序可能使用滚动版本号,例如 shell_ext_v5.dll、shell_ext_v6.dll 等。新版本有一个新编号,因此旧的 DLL 文件不一定需要被删除。
如果我采用这个策略:
- 重新安装当前版本时,我可以保持 DLL 不变,因为它没有更改。
- 升级时会安装新的DLL,注册表会指向新的版本。旧的 DLL 文件将保留在系统中,尽管未使用。
- 卸载时,如果 DLL 文件被资源管理器锁定,则可能不会被删除。
所以不好的是系统中会有剩余的DLL文件。但好处是,如果 DLL 被锁定,安装/卸载将永远不会卡住。你怎么看?还有其他选择吗?
【问题讨论】:
-
Explorer 直接支持重启管理器 API:docs.microsoft.com/en-us/windows/desktop/rstmgr/…,或者通过 MSI 安装程序:docs.microsoft.com/en-us/windows/desktop/rstmgr/…。 RM api 不需要管理员权限,并且能够优雅地关闭资源管理器并重新启动它。最终用户可以注意到(任务栏会刷新,您可能已经在安装某些东西时看到过),但资源管理器打开的窗口会自动重新打开。这完全适用于像您这样的场景。
-
Inno Setup 使用 Restart Manager API,但它有可能只有 bringing down the Explorer and not restarting it again,这使得用户很难将计算机恢复到可用状态。我希望找到一个“次优”的替代方案。
-
这个 UI 不是 RM Api。大多数情况下,RM API 会成功关闭并重新启动资源管理器。可能在某些情况下您必须杀死它,但在这种情况下,没有其他事情可做,RM Api 仍然是最好的选择
标签: dll shell-extensions