upgrading/uninstalling shell 扩展的最合理策略?

Most reasonable strategy for upgrading/uninstalling a shell extension?

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

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

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

如果我采用这个策略:

所以不好的是系统中会有残留的DLL文件。但好处是如果 DLL 被锁定,install/uninstall 永远不会卡住。你怎么看?还有其他选择吗?

编写一个小程序,删除系统中的过时文件(每次发布都添加到列表中)。

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

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

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

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

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