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

Yau*_*hun 5 registry installation inno-setup pascalscript

我想用 Inno Setup 创建一个安装程序,这是我第一次使用这个工具。
\n我\xe2\x80\x99m 试图做的是用更详细的自制安装程序(意味着Setup.exe 中的Setup.exe)包装现有软件的现有安装程序。

\n\n

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

\n\n

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

\n\n

我的问题详细如下:

\n\n
    \n
  1. 我设法使用 Inno Setup 部分添加密钥[Registry]。但是,[Registry]似乎总是在[Run]\xe2\x80\x93 之前运行,但我需要在安装后添加密钥(添加到安装本身创建的注册表路径中),而不是之前,所以我删除了已经起作用的内容(只是以错误的顺序) 在下面[Registry]。为了在主安装后完成 reg-add ,我发现了两个过程AfterInstallCurStepChanged/ ssPostInstallDeinitializeSetup这似乎不太适合我的担忧(但我想AfterInstall这就是我正在寻找的(?!),因为仅此而已应该是在之后,如果之前的安装已经失败(?!),我认为它不会运行。
  2. \n
  3. 我不知道在现有路径下添加注册表项(字符串)的 Pascal 语法。我可以将其添加到 下[Registry],但是当涉及到[Code]- 部分时,即使我现在对 Inno Setup 给定函数等做了很多研究,我也感到有点迷失。
  4. \n
  5. 第三个问题是注册表中的路径有所不同,具体取决于它是 32 位还是 64 位系统。所以我实际上需要一个额外的查询,在添加一个或另一个路径/键之前检查位系统(因为程序本身的安装已经根据位版本创建了路径),我找到了函数(IsWin64布尔值),现在尝试将函数(位版本查询)与过程(AfterInstall)混合起来,即使对我这样的初学者来说也是错误的。另外,我尝试创建一个 if-else-query,编译器告诉我我做错了。if IsWin64 then...有效,但添加 else 则无效。
  6. \n
\n\n

所以理论上的解决方案大致类似于\xe2\x80\xa6

\n\n
procedure MyAfterInstall();  \n  function IsWin64: Boolean;  \n      if 64-bit Reg-Add HKLM\\SOFTWARE\\Wow6432Node\\A\n      else Reg-Add HKLM\\SOFTWARE\\B\n
Run Code Online (Sandbox Code Playgroud)\n\n

很抱歉不能为您提供更多。我通常不编码。

\n\n

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

\n\n
[Code]\nprocedure DeinitializeSetup();\nbegin\n  RegWriteStringValue(\n    HKEY_LOCAL_MACHINE, \'SOFTWARE\\Wow6432Node\\A\', \'ConnectionString \', \'Data Source=Test;\');\nend;\n
Run Code Online (Sandbox Code Playgroud)\n\n

我使用的原因DeinitializeSetup是因为它是迄今为止对我有用的一件事,但是我知道即使用户在安装任何东西之前退出安装程序也会调用此函数,这不太好。我在安装后运行这个,因为软件安装本身创建了我想要添加密钥的路径,当软件安装失败时拥有密钥是没有意义的\xe2\x80\xa6 也许有更好的方法那个也是。
\n抱歉说了很多话,并提前感谢您的帮助。

\n

Mar*_*ryl 5

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

由于 Inno Setup 是 32 位应用程序,默认情况下它会自动重定向到Wow6432Node64 位系统。不需要明确地这样做。因此,如果这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;
Run Code Online (Sandbox Code Playgroud)

当然,除非你使用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;
Run Code Online (Sandbox Code Playgroud)

  • 另外,不要忘记“HKLM64”常量。请参阅http://www.jrsoftware.org/ishelp/index.php?topic=setupcmdline (2认同)