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.dll
、shell_ext_v6.dll
等。新版本获得新编号,因此旧 DLL文件不一定要删除。
如果我采用这个策略:
- 重新安装当前版本时,我可以保持 DLL 不变,因为它没有改变。
- 升级时会安装新的DLL,注册表会指向新版本。旧的 DLL 文件将保留在系统中,尽管未被使用。
- 卸载时,如果DLL文件被资源管理器锁定,可能无法删除。
所以不好的是系统中会有残留的DLL文件。但好处是如果 DLL 被锁定,install/uninstall 永远不会卡住。你怎么看?还有其他选择吗?
编写一个小程序,删除系统中的过时文件(每次发布都添加到列表中)。
在应用程序更新时,将注册表项添加到 HKCU\Software\Microsoft\Windows\RunOnce
,指向该程序。
下次用户登录时,将执行此程序(文件将被解锁并因此被删除),然后该条目将被系统从注册表中删除。
确保程序的 Main
函数 returns 0 作为其退出代码。
这对用户来说应该是透明的,控制台可能会闪烁window(取决于程序设置)。
所有这些都是在用户上下文中执行的,因此不需要管理员权限或 UAC。
我想为仅供当前用户安装的 shell 扩展程序创建安装程序。我希望最终用户尽可能无缝地升级和卸载到 运行。
问题是加载的 shell 扩展 DLL 可以注销但不能删除,因为它被资源管理器锁定了。安装程序将在尝试删除 DLL 时卡住。由于 shell 扩展只为当前用户安装,我无法利用任何需要管理员权限的 "delete DLL on reboot" 选项。我也不能使用 explorer.exe 的硬重启,因为它可能会使计算机处于最终用户无法使用的状态:通常,重启资源管理器会关闭但不会再次启动。
查看其他一些应用程序的 DLL 后,似乎有些应用程序可能正在使用滚动版本号,例如 shell_ext_v5.dll
、shell_ext_v6.dll
等。新版本获得新编号,因此旧 DLL文件不一定要删除。
如果我采用这个策略:
- 重新安装当前版本时,我可以保持 DLL 不变,因为它没有改变。
- 升级时会安装新的DLL,注册表会指向新版本。旧的 DLL 文件将保留在系统中,尽管未被使用。
- 卸载时,如果DLL文件被资源管理器锁定,可能无法删除。
所以不好的是系统中会有残留的DLL文件。但好处是如果 DLL 被锁定,install/uninstall 永远不会卡住。你怎么看?还有其他选择吗?
编写一个小程序,删除系统中的过时文件(每次发布都添加到列表中)。
在应用程序更新时,将注册表项添加到 HKCU\Software\Microsoft\Windows\RunOnce
,指向该程序。
下次用户登录时,将执行此程序(文件将被解锁并因此被删除),然后该条目将被系统从注册表中删除。
确保程序的 Main
函数 returns 0 作为其退出代码。
这对用户来说应该是透明的,控制台可能会闪烁window(取决于程序设置)。
所有这些都是在用户上下文中执行的,因此不需要管理员权限或 UAC。