在Inno Setup

时间:2017-01-16 13:45:36

标签: registry installer inno-setup pascalscript

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

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

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

我的问题详情如下:

  1. 我设法使用Inno Setup的[Registry]部分添加密钥。但是,[Registry]似乎总是在[Run]之前运行 - 但我需要在安装后添加密钥(在安装本身创建的regedit-path中添加),而不是之前,所以我删除了已经工作的内容(只是在错误的顺序中)[Registry]下。为了在主安装后完成一个reg-add,我发现了两个程序AfterInstallCurStepChanged / ssPostInstall以及DeinitializeSetup,这似乎不适合我的关注(但是考虑AfterInstall将是我正在寻找的东西(?!),因为如果安装之前已经失败了(?!),那么我认为它不会再运行了,我认为它不会运行。 / LI>
  2. 我不知道在现有路径下添加注册表项(字符串)的Pascal语法。我可以在[Registry]下添加它,但是当谈到[Code] - 部分时,我觉得有点迷失,即使我现在做了很多关于Inno Setup的研究,给出了函数等等。
  3. 第三个问题是注册表中的路径有所不同,具体取决于它是32位还是64位系统。所以我实际上需要在添加一个或另一个路径/密钥之前检查位系统的额外查询(因为程序本身的安装根据位版本创建了路径),我找到了函数{{1} }(布尔值),现在尝试将函数(位版本查询)与过程(IsWin64)混合起来,即使对我来说也是一个错误的初学者。另外,我尝试创建一个if-else查询,编译器告诉我,我做错了。 AfterInstall有效,但添加其他内容则无效。
  4. 因此理论中的解决方案大致类似......

    if IsWin64 then...

    很抱歉没有为您提供更多服务。我通常不会编码。

    如果相关,那就是我到目前为止在代码部分中所拥有的内容:

    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; 的原因是因为到目前为止这对我有用,但我知道即使用户在安装任何内容之前退出设置也会调用此函数,这不太好。我在安装后运行它,因为软件安装本身创建了我想要添加密钥的路径,在软件安装失败时使用密钥是没有意义的......也许有更好的方法。登记/> 为许多话道歉,并提前感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

要在安装完成后执行代码,请使用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

另请参阅:Writing 32/64-bit specific registry key in Inno Setup

如果密钥路径确实不同,请使用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;