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

Writing 32/64-bit specific registry key at the end of the installation in Inno Setup

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

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

特别是:我想在安装结束时添加一个注册表项,作为最后一步,适合相关的位系统(32/64 位)。 在这里我要请专家帮忙。 (主要关注点)

我的问题详细如下:

  1. 我设法使用 Inno Setup 的 [Registry] 部分添加了密钥。但是,[Registry] 似乎总是在 [Run] 之前 运行 – 但我需要在安装后添加密钥(添加到安装本身创建的注册表编辑器路径中),而不是之前,所以我删除了[Registry] 下已经有效的(只是顺序错误)。为了在主安装后完成注册添加,我发现了两个程序 AfterInstallCurStepChanged/ssPostInstall,以及 DeinitializeSetup 这似乎不太适合我的关注(但认为 AfterInstall 将是我正在寻找的(?!),因为之后应该没有更多的东西了,我认为它不会 运行,如果之前的安装已经失败(? !).
  2. 我不知道在现有路径下添加注册表项(字符串)的 Pascal 语法。我可以在 [Registry] 下添加它,但是当涉及到 [Code] 部分时,即使我现在对 Inno Setup 给定函数等进行了大量研究,我仍然感到有些迷茫。
  3. 第三个问题是注册表中的路径不同,这取决于它是 32 位系统还是 64 位系统。所以我实际上需要一个额外的查询,在添加一个或另一个 path/key 之前检查位系统(因为程序本身的安装已经根据位版本创建了路径),我找到了函数 IsWin64(布尔值),现在尝试将函数(位版本查询)与过程 (AfterInstall) 混合使用,即使对我这样的初学者来说也是错误的。另外,我尝试创建一个 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 的原因是因为到目前为止它对我有用,但是我知道即使用户在安装任何东西之前退出安装程序也会调用此函数,这不太好.我在安装后 运行 宁此,因为软件安装本身创建了我想要添加密钥的路径,在软件安装失败时拥有密钥是没有意义的......也许有更好的方法那也是。
抱歉说了很多话,在此先感谢您的帮助。

要在安装完成后执行代码,请使用 CurStepChanged event function 并检查 CurStep = ssPostInstall

由于 Inno Setup 是 32 位应用程序,默认情况下它会自动 gets redirected to the Wow6432Node on 64-bit systems。无需明确地这样做。因此,如果 Wow6432Node 是 32 位和 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-bit installation mode

另请参阅:


如果密钥路径确实不同,请使用 IsWin64 function:

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;