2017-01-16 121 views
2

我想用Inno Setup创建一个安装程序,这是我第一次使用此工具。
我想要做的是用更详细的自制安装程序(即Setup.exe中的Setup.exe)封装现有软件的现有安装程序。在Inno Setup安装结束时编写32/64位特定注册表键

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

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

我的详细问题如下:

  1. 我设法使用创新安装的[Registry]部分增加的关键。然而,[Registry]似乎总是在[Run]之前运行 - 但我需要在安装后添加的密钥(添加到安装本身创建的注册表路径中),而不是之前,所以我删除了[Registry]之前已经工作的(只是顺序错误) 。为了在主安装后完成reg-add,我找到了两个程序AfterInstallCurStepChanged/ssPostInstallDeinitializeSetup,这似乎不适合我的关注(但想到AfterInstall将是我正在寻找的? ),因为没有更多的应该来之后,我认为它不会运行,如果安装之前已经失败(?!)
  2. 我不知道用于添加注册表键(字符串)的Pascal语法,我可以在[Registry]之下添加它,但是当涉及到[Code]部分时,即使我现在对Inno Setup给出了许多功能等方面的研究,我也感觉有点遗憾。
  3. 第三个问题是,注册表中的路径会有所不同,具体取决于它是32位还是64位位系统。所以实际上在添加一个或另一个路径/关键字之前(这是因为程序本身的安装根据位版本创建了路径)之前实际上需要额外的查询来检查位系统,所以我发现函数IsWin64(布尔值) ,现在试图将一个函数(位版本查询)与一个过程(AfterInstall)混合起来,即使对我而言,初学者也是错误的。另外我试着创建一个if-else-query,编译器告诉我我做错了。 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; 

我之所以用DeinitializeSetup是因为它是一两件事,为我工作,到目前为止,但是我知道这个功能是即使用户在安装任何东西之前退出设置,这也不是很好。我在安装后运行它,因为软件安装本身创建了我想要添加密钥的路径,在软件安装失败时拥有密钥是没有意义的......也许还有更好的方法。
很多道歉,并提前感谢任何帮助。

+0

是不是真的'HKLM \ SOFTWARE \ Wow6432Node \ A' VS'REG-添加HKLM \ SOFTWARE \ B'或者说'注册 - 添加HKLM \ SOFTWARE \ A'?即是唯一的区别'Wow6432Node'还是实际的关键路径结尾也不同? –

+0

@MartinPrikryl你说得对,“Wow6432Node”是唯一的区别。其余的都是一样的,即使我想添加的数据记录对于32位和64位版本都是一样的。 – Yauhun

回答

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; 
+0

天啊,它终于奏效了。不能相信我花了多少时间...非常感谢。 (也感谢上面的编辑/修复,我倾向于说太多。)嗯,我在两个位版本之间做了这个区别,因为主要安装在创建注册表路径和数据记录时做了,并且我只想添加还有一个字符串。也许我在这里缺乏基本的理解。 – Yauhun