在Inno Setup安装结束时编写32/64位特定的注册表项

游魂

我想用Inno Setup创建一个安装程序,这是我第一次使用此工具。
我想做的是将现有软件的现有安装程序与更详细的自制安装程序一起包装(意味着Setup.exe中的Setup.exe)。

经过到目前为止的研究,对我有用的是要求安装程序(Inno Setup * .exe)运行附带的安装程序(实际软件安装程序)。
为什么需要包裹另一个安装程序?因为我想给它一些额外的功能。

特殊的事情是:我想在安装结束时添加一个注册表项,作为最后一步,适合于相关的位系统(32/64位)。这是我要寻求专家帮助的地方。(主要关注)

我的问题详细如下:

  1. 我设法使用[Registry]Inno Setup部分添加了密钥但是,它[Registry]似乎总是在运行之前[Run]–但是我需要在安装后添加密钥(在安装本身创建的regedit路径中添加),而不是之前添加的密钥,因此我删除了下已经起作用的文件(只是顺序错误)[Registry]为了在主安装后完成reg-add,我找到了两个过程AfterInstallCurStepChanged/ ssPostInstallDeinitializeSetup这似乎与我的关注不太吻合(但是考虑AfterInstall到我正在寻找的是(?!),因为仅此而已。如果安装之前已经失败(?!),应该会之后,我认为它不会运行。
  2. 我不知道在现有路径下添加注册表项(字符串)的Pascal语法。我可以在下面添加它[Registry],但是当涉及到[Code]-section时,即使到现在我对有关给定功能的Inno Setup进行了大量研究,我仍然感到有些失落。
  3. 第三个问题是注册表中的路径会有所不同,具体取决于它是32位还是64位系统。所以我实际上需要一个额外的查询来检查位系统,然后再添加一个或另一个路径/密钥(因为程序的安装本身已经根据位版本创建了路径),我找到了函数IsWin64(布尔),现在,AfterInstall即使对于初学者来说,尝试将函数(bit-version-query)与过程(混在一起听起来也是如此。另外,我尝试创建一个if-else-query,编译器告诉我我做错了。if IsWin64 then...可以,但是添加else则无效。

因此,理论上的解决方案大致类似于...

procedure MyAfterInstall();  
  function IsWin64: Boolean;  
      if 64-bit Reg-Add HKLM\SOFTWARE\Wow6432Node\A
      else Reg-Add HKLM\SOFTWARE\B

抱歉,不必为您提供更多服务。我通常不编码。

如果相关的话,这就是我到目前为止的代码部分:

[Code]
procedure DeinitializeSetup();
begin
  RegWriteStringValue(
    HKEY_LOCAL_MACHINE, 'SOFTWARE\Wow6432Node\A', 'ConnectionString ', 'Data Source=Test;');
end;

我之所以使用DeinitializeSetup它,是因为到目前为止这是对我有用的一件事,但是我知道即使用户在安装任何东西之前退出安装程序,该函数都将被调用,这并不是很好。我在安装后运行此程序,因为软件安装本身会创建我想要添加密钥的路径,在软件安装失败时拥有密钥是没有意义的……也许对此也有更好的方法。
抱歉,很多话,并预先感谢您的帮助。

马丁·普里克里(Martin Prikryl)

要在安装完成后执行代码,请使用CurStepChanged事件功能并检查CurStep = ssPostInstall

由于Inno Setup是32位应用程序,因此默认情况下会自动将其重定向到Wow6432Node64位系统上无需明确地执行此操作。因此,如果Wow6432Node32位和64位路径之间的唯一区别是,则无需执行任何特殊操作:

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then
  begin
    Log('Installation finished, writing connection string');
    RegWriteStringValue(
      HKEY_LOCAL_MACHINE, 'SOFTWARE\A', 'ConnectionString', 'Data Source=Test;');
  end;
end;

当然,除非您使用64位安装模式

另请参阅:在Inno Setup中编写特定于32/64位的注册表项


如果密钥路径确实不同,请使用以下IsWin64函数

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then
  begin
    if IsWin64 then
    begin
      Log('Installation finished, writing 64-bit connection string');
      RegWriteStringValue(
        HKEY_LOCAL_MACHINE, 'SOFTWARE\A', 'ConnectionString', 'Data Source=Test;');
    end
      else
    begin
      Log('Installation finished, writing 32-bit connection string');
      RegWriteStringValue(
        HKEY_LOCAL_MACHINE, 'SOFTWARE\B', 'ConnectionString', 'Data Source=Test;');
    end;
  end;
end;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章