当前位置: 首页 > 知识库问答 >
问题:

使用Inno Setup更新DLL服务器

凌修伟
2023-03-14

如果用户第一次安装我的应用程序,我如何构建我的Inno安装脚本以自动注册dll,但如果有一个以前的版本,则取消注册,然后注册新版本(假设界面不同)?

我目前在我的文件部分使用regserver和忽略reversion标志,如下所示:

[Setup]
...

[Languages]
...

[Files]
Source: "C:\example.dll"; DestDir: "{app}"; Flags: ignoreversion regserver

在我的谷歌搜索中,我找到了Un注册表服务器,但我不知道如何将其添加到我的脚本中。我很乐意开始修补以了解它是如何工作的,但我不想做任何会弄乱我的注册表的事情。

这里有一篇类似的文章,但它没有说明这是如何实际完成的。

编辑

在Pascal中进行了黑客攻击之后,我能够将以下内容添加到[Code]部分,并且它起到了作用。有人知道如何使用{app}常量在下面的代码中动态定义fileName吗?

[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;

共有2个答案

解晟睿
2023-03-14

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

 function UnregisterCOMServer(sServerCLSID: String): Boolean;
var
   sServerPath: String;
Begin
    Result:=False;
     //search in HKCR (merged view)
     if RegQueryStringValue(HKEY_CLASSES_ROOT, 'CLSID\'+sServerCLSID+'\InprocServer32', '', sServerPath) then
     Begin
        if sServerPath<>'' then
        Begin
            Log('Found COM server CLSID:'+ sServerCLSID +', path:'+sServerPath);
            Result:=UnregisterServer(False, sServerPath, True);
            if Result then Log('COM server '+ sServerCLSID +' unregistered.')
            else Log('UnregisterServer on '+ sServerPath +' failed!');
        end
        else Log('No COM server path found.');
     end
     else Log('COM server CLSID:'+ sServerCLSID +' not found!'+sServerPath);

结束;

乐正远
2023-03-14

对文件使用BeforeInstall和AfterInstall参数怎么样?

用法是:

[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;
 类似资料:
  • 在RoomDatabase中创建数据库时,一切工作都很好,并且数据已成功加载,但是,我需要更新服务中生成的数据,问题是它需要下一行中的活动上下文: Dao接口: 存储库: 服务: 我希望服务在LiveData列表中执行、保存和刷新新结果,但我不能声明LiveData列表。

  • 问题内容: 我有一个宠物项目,它是一个在线游戏,整个游戏引擎都是用C#编写的,我想知道是否仍然可以从使用Node.JS构建的解决方案中调用此现有程序集(.dll)的功能。 ,Socket.IO,Express等? 游戏引擎本身非常完整。经过测试且功能强大。我希望有一些简洁的方法来公开其功能,而又不会增加太多开销。 更新 : 稍微回答一下我自己的问题。.我已经结束了构建自己的Web套接字服务器(基于

  • 需要更新时钟小部件的TextView每秒或每分钟变化。 我正在从AppWidgetProvider的onReceive调用服务: 我应该做什么来检查更新的时间,如果有,然后更新‘时间’文本视图… 任何一种都是非常非常非常感谢的

  • 我的Kubernetes集群运行在谷歌云下。我有部署运行端口443和LoadBalancer公开它到互联网。 我是这样创建的: 运行此命令后,loadbalancer将指向部署。现在,我创建了,并希望更改loadbalancer以指向新的部署()。 注意:删除和重新创建部署是释放外部IP地址,我想避免它。 如何在不丢失外部IP的情况下修补现有服务以指向另一个部署?

  • 我一直在阅读《html5rocks服务工作者简介》一文,并创建了一个基本的服务工作者,它可以缓存页面、JS和CSS,并按预期工作: 当我对CSS进行更改时,由于服务人员正在从缓存中正确返回CSS,因此不会拾取此更改。 我陷入困境的地方是,如果我要更改HTML、JS或CSS,我如何确保服务人员可以从服务器加载较新版本,而不是从缓存加载?我曾尝试在CSS导入上使用版本戳,但似乎不起作用。

  • EXCEL服务器应用表间更新公式        先在《商品表》给“36寸液晶电视”输入“当前库存”为10,保存。然后新建一份《订货单》,并传递完成,如下图所示: 这时,我们再去《商品表》中查看“36寸液晶电视”,发现“预定库存”有 0 变成1了,如下图所示: 表明表间更新公式“更新预定库存”已经被执行了。