【问题标题】:Update DLL Server with Inno Setup使用 Inno Setup 更新 DLL 服务器
【发布时间】: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


【解决方案1】:

如何为文件使用 BeforeInstallAfterInstall 参数?

用法是:

[Files]
Source: "MYDLL.DLL"; DestDir: "{app}"; BeforeInstall: MyBeforeInstall; AfterInstall: MyAfterInstall;

BeforeInstall 和 AfterInstall 函数不能有返回值!

procedure MyBeforeInstall();
begin
  // Your code here: If file (old) file exists call UnregisterServer() on old file
  // Use function FileExists(const Name: String): Boolean; or similar for it
  // Also you can delete the file entirely with function DeleteFile(const FileName: string): Boolean;

  // Hint: You can use 'CurrentFileName' variable to get currently processed file 
end;

procedure MyAfterInstall();
begin
  // Your (new) file was processed and now you can do additional tweaks on it
  // 'CurrentFileName' variable is still available 
  // Setup registers all files with the 'regserver' or 'regtypelib' flags as the last step of installation so in this function the file is still not registered!
end;

【讨论】:

  • 我喜欢这个,听起来很简单。我会看看我是否可以通过 eod 测试一下。我还没有使用 AfterInstall,但很高兴知道。
【解决方案2】:

试试这个,它还可以处理 32/64 位并排 COM 服务器:

 function UnregisterCOMServer(sServerCLSID: String): Boolean;
变量
   sServerPath:字符串;
开始
    结果:=假;
     //在 HKCR 中搜索(合并视图)
     如果 RegQueryStringValue(HKEY_CLASSES_ROOT, 'CLSID\'+sServerCLSID+'\InprocServer32', '', sServerPath) 然后
     开始
        如果 sServerPath'' 那么
        开始
            Log('找到COM服务器CLSID:'+ sServerCLSID +', path:'+sServerPath);
            结果:=UnregisterServer(False, sServerPath, True);
            if Result then Log('COM server '+ sServerCLSID +' unregistered.')
            else Log('UnregisterServer on '+ sServerPath +' failed!');
        结尾
        else Log('未找到 COM 服务器路径。');
     结尾
     else Log('COM server CLSID:'+ sServerCLSID +' not found!'+sServerPath);

 if Is64BitInstallMode then
 Begin
     if RegQueryStringValue(HKEY_CLASSES_ROOT, 'Wow6432Node\CLSID\'+sServerCLSID+'\InprocServer32', '', sServerPath) then
     Begin
        if sServerPath<>'' then
        Begin
            Log('Found COM server (Wow6432) CLSID:'+ sServerCLSID +', path:'+sServerPath);
            Result:=UnregisterServer(True, sServerPath, True);
            if Result then Log('COM server (Wow6432) '+ sServerCLSID +' unregistered.')
            else Log('UnregisterServer (Wow6432) on '+ sServerPath +' failed!');
        end
        else Log('No COM server (Wow6432) path found.');
     end
     else Log('COM server (Wow6432) CLSID:'+ sServerCLSID +' not found!'+sServerPath);
 end;

结束;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-28
    • 2011-05-08
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    相关资源
    最近更新 更多