当前位置: 首页 > 知识库问答 >
问题:

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

夏侯渊
2023-03-14

我想用Inno Setup创建一个安装程序,这是我第一次使用这个工具。< br >我尝试做的是用一个更详细的自制安装程序(指Setup.exe里面的Setup.exe)包装一个现有软件的现有安装程序。

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

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

我的问题具体如下:

    < li >我使用Inno安装程序的< code>[Registry]部分添加了该键。然而,< code>[Registry]似乎总是在< code>[Run]之前运行——但是我需要在安装之后添加密钥(在安装本身创建的regedit-path中添加),而不是在之前,所以我删除了< code>[Registry]下已经运行的密钥(只是顺序不对)。为了在主安装之后完成reg-add,我发现了两个过程< code>AfterInstall和< code > curstep changed /< code > ssposinstall ,以及< code>DeinitializeSetup,这似乎不太适合我所关心的问题(但我认为< code>AfterInstall将是我所寻找的(?!)因为之后应该不会再有什么,而且我认为它不会运行,所以如果之前的安装已经失败(?!). < li >我不知道在现有路径下添加注册表项(字符串)的Pascal语法。我可以将它添加到< code>[Registry]下,但是当提到< code>[Code]部分时,我感到有点困惑,尽管我现在已经对Inno Setup给定函数等做了很多研究。 < li >第三个问题是注册表中的路径不同,这取决于它是32位还是64位系统。因此,我实际上需要一个额外的查询,在添加一个或另一个路径/键之前检查位系统(因为程序本身的安装已经根据位版本创建了路径),我发现函数< code>IsWin64 (Boolean),现在试图将函数(位版本查询)与过程(< code>AfterInstall)混合在一起,即使对我这样的初学者来说也是错误的。另外,我试图创建一个if-else-query,编译器告诉我这样做是错误的。< code >如果是Win64,则...起作用,但是添加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,是因为这是迄今为止对我有效的一件事,但是我知道即使用户在安装任何东西之前退出安装程序,也会调用此函数,这不是很好。我在安装后运行这个,因为软件安装本身创建了我想要添加密钥的路径,在软件安装失败时使用密钥是没有意义的……也许还有更好的方法
对很多话表示歉意,并提前感谢您的帮助。

共有1个答案

别浩漫
2023-03-14

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

由于Inno Setup是32位应用程序,默认情况下,它会自动重定向到64位系统上的Wow6432Node。不需要明确地这样做。因此,如果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位安装模式。

另请参阅:在 Inno 安装程序中写入 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;
 类似资料:
  • 如果操作系统是64位,我想安装一个32位的DLL到文件夹和64位的DLL到文件夹并分别注册它们。如果是32位操作系统,我只想将文件复制到正常程序文件夹并注册。 如何在Inno安装程序中执行此操作?64位DLL也会被64位程序注册吗? 这是我到目前为止的代码。它在 32 位操作系统上工作正常,但在 64 位操作系统上,它会转储 中的两组文件。 我已经看过示例,但它告诉如何进行32位或64位安装,而不

  • 本文向大家介绍安装SQL server 2005 出现警告 32位ASP.NET已经注册,需要注册64位的解决方法,包括了安装SQL server 2005 出现警告 32位ASP.NET已经注册,需要注册64位的解决方法的使用技巧和注意事项,需要的朋友参考一下 可以运行以下两条命令: 1.将64位.net注册到iis上。 cscript C:\inetpub\adminscripts\adsut

  • 问题内容: 是否可以在Windows 7上同时安装32位和64位Java? 我有一些应用程序可以在64位下运行,但是有些应用程序只能在32位下运行。 问题答案: 是的,绝对没有问题。您甚至可以同时在同一台计算机上安装32位和64位Java的多个版本。 实际上,我本人也有这样的设置。

  • 方式1:在脚本编辑器里一句一句地写,需要熟悉注册表相关知识和NSIS脚本语法。 如 ;关闭XP文件保护 WriteRegDWORD HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" "SFCDisable" 0xffffff9d ;开放匿名方式获取本机信息 WriteRegDWORD HKLM "SYSTEM\Current

  • 问题内容: 我有Windows Vista 64。 我有一些项目需要Python 2.7.3 64位,而其他项目则需要Python 2.7.3 32位(因为某些扩展不能在64位上工作)。 如何防止Python 2.7.3 MSI安装程序(32或64 Bot)删除其他版本。 并排使用Python 2.7.2为我工作没有问题。 问题答案: 在Windows 7 64位上,这似乎对我有用。选择一个版本作

  • 本文向大家介绍32位和64位皆适用的MyEclipse安装教程,包括了32位和64位皆适用的MyEclipse安装教程的使用技巧和注意事项,需要的朋友参考一下 MyEclipse *的下载,找到MyEclipse的各种历史版本下载页面:http://www.myeclipsecn.com/ 简单说下,MyEclipse自己会带一个JDK,他是eclipse加插件的增强版,就不用安装eclipse了