【发布时间】:2013-05-01 22:03:31
【问题描述】:
如果用户第一次安装我的应用程序,我如何构建我的 Inno Setup 脚本以自动注册一个 dll,但如果有一个以前的版本,则取消注册,然后注册新的(假设界面不同) ?
我目前在我的文件部分使用 regserver 和 ignoreversion 标志,如下所示:
[Setup]
...
[Languages]
...
[Files]
Source: "C:\example.dll"; DestDir: "{app}"; Flags: ignoreversion regserver
在我的谷歌搜索中,我找到了UnregisterServer,但我不知道如何将它添加到我的脚本中。我很乐意开始修补看看它是如何工作的,但我不想做任何会弄乱我的注册表的事情。
有一个类似的帖子here,但它没有说明这是如何实现的。
编辑
在 Pascal 中进行修改后,我能够将以下内容添加到 [Code] 部分并且它起作用了。 有人知道如何在下面的代码中使用 {app} 常量来动态定义文件名吗?
[Code]
const
fileName = 'C:\Program Files\TFolderName\tigercontroller.dll';
var
serverExists: Boolean;
function InitializeSetup(): Boolean;
begin
serverExists := UnregisterServer(False, fileName, False);
if serverExists then begin
Result:= True;
MsgBox('This will update with the most recent version', mbInformation, mb_Ok);
end else
Result := True;
end;
【问题讨论】:
-
在
InitializeSetup时间扩展{app}常量还为时过早。此外,{app}常量包含当前选择的安装文件夹,而您想检查以前的应用程序文件夹。您可以从InitializeWizard事件方法中最快地从WizardForm.PrevAppDir属性中获取最后一个文件夹,例如this way. -
特拉玛,谢谢!我想知道为什么我不能引用 {app}。 WizardForm.PrevAppDir 是如何工作的?我是否必须保持我的 .iss 脚本不变,以便向导知道该向导以前被使用过?
-
通常,您不应该充分更改 COM 接口以使它们不兼容(您应该只添加,从不减去)。因此,永远不需要注销旧版本。当然,当它是应用程序私有库而不是共享库时,您会获得更多的回旋余地。
-
我的印象是,如果我在接口上添加一个新的方法调用,我需要取消注册以前的 COM 接口并重新注册新的接口(使用相同的 GUID)。不是这样吗?
-
@Michael,
WizardForm.PrevAppDir只是一个保存文件夹路径的属性,其中具有特定AppId的安装程序之前已经安装了该应用程序(如果尚未安装则为空)。换句话说,除非您更改脚本中的AppId,否则此属性将返回您以前的安装文件夹路径。一旦您更改了AppId,它将被视为不同的设置。
标签: dll inno-setup pascal updates regsvr32