4

我有一个程序产品,它另外将外壳扩展安装到 Windows 资源管理器。它用 C# 制作并使用 .NET Framework v4.0。Shell 扩展是由 Inno Setup 在安装期间使用 regasm.exe 安装的。一切正常,直到我想安装更新版本的应用程序。问题是我无法更新 shell 扩展 dll,因为它已加载到资源管理器的内存中。在安装 Inno Setup 之前向我显示以下消息

在此处输入图像描述

它说安装程序需要终止 Windows 资源管理器,因为它使用应由安装程序更新的文件。 它终止了资源管理器进程,但不会再次启动他。这是我的第一个问题。

其实我不想强迫用户关闭资源管理器。但我不知道如何从资源管理器的内存中卸载托管 shell dll。如果通过 regasm.exe 卸载它,dll 仍然保留在内存中。事实上,我什至找不到发生这种检查的地方,因为我收到了已经制作的安装源。

用于 Inno Setup 的 Files-In-Use (IssProc.dll) 加载项没有帮助,因为一旦我通过此加载项终止 Windows 资源管理器,资源管理器就会立即重新启动。

我该如何解决这个问题?如何以更好的用户体验更新 shell 扩展 dll?也许有人可以给我一个提示,检查正在使用的文件的代码在哪里?

O 和 BTW 我使用的是 Windows 7 x64。

4

2 回答 2

3

在文件条目处使用restartreplace标志。从参考:

当需要替换现有文件并且它正在被另一个正在运行的进程使用(锁定)时,默认情况下,安装程序将显示一条错误消息。此标志告诉安装程序在下次重新启动系统时注册要替换的文件(通过调用 MoveFileEx 或通过在 WININIT.INI 中创建条目)。发生这种情况时,将提示用户在安装过程结束时重新启动计算机。

因此,使用此标志不会导致向导要求终止使用该文件的应用程序,而是将文件更新安排到下次重新启动并提示用户在安装结束时重新启动计算机,我认为这是非常用户友好和常用的.

于 2012-07-20T21:00:11.907 回答
0

要禁用提示,您应该在 [Setup] 中简单地设置“CloseApplications=no”。但是,如果您确定需要更换,您仍然需要在 [File] 中使用 restartplace 标志,但稍后再进行。

于 2014-12-15T09:02:17.857 回答