【问题标题】:Most reasonable strategy for upgrading/uninstalling a shell extension?升级/卸载外壳扩展的最合理策略?
【发布时间】:2019-05-01 17:23:34
【问题描述】:

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

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

查看其他应用程序的 DLL 后,似乎有些应用程序可能使用滚动版本号,例如 shell_ext_v5.dllshell_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


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    • 2011-11-15
    • 1970-01-01
    相关资源
    最近更新 更多