.net 框架的 inno 设置检查 Sap Crystal 报告运行时引擎

Posted

技术标签:

【中文标题】.net 框架的 inno 设置检查 Sap Crystal 报告运行时引擎【英文标题】:inno setup check Sap Crystal reports runtime engine for .net framework 【发布时间】:2014-10-13 08:40:58 【问题描述】:

我目前正在尝试创建用于安装程序的自定义脚本。我需要检查是否安装了水晶报表 13 的运行时引擎,如果没有安装。 这就是我想要做的:

  //check crystalReports
  if (not RegKeyExists(HKLM, 'Software\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Crystal Reports')) then
  begin
      crystalReportsNeeded := true;
      if (not IsAdminLoggedOn()) then begin
          MsgBox('GasSoft needs the Crystal Reports to be installed by an Administrator', mbInformation, MB_OK);
          Result := false;
      end 
      else 
      begin
          memoDependenciesNeeded := memoDependenciesNeeded + '     Crystal Reports' #13;
          SetIniString('install', 'dotnetRedist', dotnetRedistPath,  ExpandConstant('tmp\dep.ini'));
     end;
  end else
  begin 
       MsgBox('installed cr', mbInformation, MB_OK);
  end;

所以这是将 var caleed crystallreportsneeded 更新为真或假。 此变量将用于文件的检查功能。 我在控制面板上检查了运行时引擎是否已安装,但每次我运行安装程序时,它都会尝试安装文件。 我错过了什么。,regkey 是否正确?

经过一番搜索,我发现有些人没有搜索文件夹,而是转到 HKLM->Windowns->CurrentVersion->Unistall 中的卸载文件夹。 在我的情况下,有一个带有产品代码的 sap 组件的寄存器,但这确实会产生问题,如果无论如何我通过网络更新 sap 水晶报告的版本,然后尝试运行它创建的安装脚本当前安装的版本比我当前尝试安装的版本新的问题...

14/10/2014 - 更新... 所以我仍然无法检查程序是否安装,我也尝试过这样做

sUnInstPath := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\1D8E6291-B0D5-35EC-8441-6616F567A0F7'); //Your App GUID/ID
sUnInstallString := '';
if RegQueryStringValue(HKLM, sUnInstPath, 'InstallDate', sUnInstallString) then
MsgBox('Exists... ' , mbInformation, MB_OK);

这个 1D8E6291-B0D5-35EC-8441-6616F567A0F7 在这种情况下指的是应用程序 id vcc+... 我也试过这个

RegQueryDWordValue(HKLM, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\1D8E6291-B0D5-35EC-8441-6616F567A0F7', 'Version', version);

它不显示消息,, 目前有 2 个选项,一个始终安装,两个使用 FileExists 检查文件是否存在..所以任何帮助表示赞赏..

更新 - 2014 年 15 月 10 日 所以我想我找到了一种解决方法,我不认为这是一个解决方案,因为我无法解释正在发生的一些事情.. 此解决方法仅适用于您使用 Crystal 报表并且仍需要在 32 位机器上进行测试的情况,但我几乎可以肯定它也可以工作。 目前我正在使用 win 8.1 在 64 位机器上进行测试,我也会在 32 位机器上测试脚本。

所以我需要将一个用于 x32 的脚本和另一个用于 x64 的脚本分开。 区别在于 [setup] 参数,如果 setup 用于 64 位,则需要这两行:

ArchitecturesInstallIn64BitMode=x64
ArchitecturesAllowed=x64

这些是描述:

ArchitecturesAllowed=x64 指定安装程序只能在 x64 上运行。 ArchitecturesInstallIn64BitMode=x64" 请求安装 在 x64 上以“64 位模式”完成,这意味着它应该使用本机 64 位 Program Files 目录和注册表的 64 位视图。

所以我目前声明该脚本只能在 64 位上运行,并且文件夹系统是 64 位..

添加这两行后,查找密钥的代码将成功执行。 尝试查找密钥是否存在的代码如下..

sKey:=ExpandConstant('SOFTWARE\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Crystal Reports');
MsgBox('Before if'  , mbInformation, MB_OK); //trying to test if is reaching this statement..
if( RegKeyExists(HKLM, sUnInstPath)) then begin
   MsgBox('key found'  , mbInformation, MB_OK);

仅当您需要安装 64 位水晶报表运行时引擎时才会发生这种情况。 在我的脚本中,我正在检查是否安装了 sql server,如果不存在则安装。

如果您在 64 位机器上安装了 32 位 crruntime 引擎,那么您不需要添加这些行。 密钥的路径现在是 SOFTWARE\Wow6432Node\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Crystal Reports 我不知道是否可以在 [Setup] 上添加一个 if 条件,表明如果我在 64 位机器上运行安装程序,则添加 2 行代码..

如果情况有新的更新,我会更新帖子... 提前谢谢..

【问题讨论】:

如果您将在 64 位 Windows 上运行(IsWin64 函数可以告诉您)并且您的设置将在 32 位模式下运行(如果您省略 ArchitecturesInstallIn64BitMode 指令),您可以使用 HKLM64 根键访问 64 位注册表视图。注册表有两种视图,32 位和 64 位一种。因为 Inno Setup 是 32 位应用程序,所以它默认映射到 32 位注册表视图,正如您所描述的,您要查找的密钥存储在 64 位注册表视图中(如果您在非 Wow 节点下可以看到运行 64 位 regedit,这是 64 位 Windows 上的默认值)。 我认为在 64 位系统上,您应该检查两个视图的关键存在,因为在 64 位系统上,您可以安装 32 位或 64 位 Crystal Reports,不是吗?而且我相信 32 位 CR 会写入 32 位寄存器。查看和 64 位到 64 位。 这取决于您正在查看的注册表。您的系统上有两个注册表编辑器。一个是 32 位,第二个是 64 位。默认打开 64 位视图,将 64 位视图显示为普通树,Wow6432Node 下显示 32 位视图。 32位的反之亦然。您没有直接访问 Wow6432Node 节点。您正在为此使用重定向器。 Inno Setup 允许您访问这两个视图。如果您在 32 位模式下运行它(没有 ArchitecturesInstallIn64BitMode 指令),HKLM(或 HKLM32)映射到 32 位注册表视图,而 HKLM64 映射到 64 位。 不客气!如果您想了解有关注册表重定向器的更多信息,可以关注this topic。这听起来很复杂,但总之很容易。 32 位应用程序(无论它们是什么)默认情况下访问 32 位注册表视图、64 位应用程序。 64 位视图。您在 64 位 Windows 中打开的(默认情况下)是 64 位 regedit,它在 Wow6432Node 节点下显示 32 位视图。 默认情况下 Inno Setup 在所谓的 32 位模式下运行,它将根键(如 HKLM)映射到 32 位注册表视图。 这是一个 32 位应用程序,因此默认情况下(除非您使用 64 位模式)访问 32 位视图。我会责怪 regedit 在一些有用的视图中没有显示位视图。人们通常打开(默认)64 位注册表并在非Wow6432Node(64 位视图)中看到某个键。然后他们尝试在他们的 32 位应用程序的默认视图下打开这样的密钥,想知道“我的密钥在哪里?”。是的,当你使用HKLM64 时,你总是在访问 64 位视图(这就是为什么你必须检查你是否在 64 位系统上,因为在 32 位系统上没有这样的视图)。 【参考方案1】:

感谢用户 TLama,这解释了 inno 设置如何在 64 位机器上工作。 这是检查是否安装了水晶报告运行时引擎13的代码:

[Code]
const
    CrystalReportsKey = 'SOFTWARE\SAP BusinessObjects\Crystal Reports for .NET Framework 
4.0\Crystal Reports';
var
    crNeeded:boolean;
    memoDependenciesNeeded: string;
function InitializeSetup(): Boolean;
begin
    if (IsWin64 and (not RegKeyExists(HKLM64, CrystalReportsKey) or not RegKeyExists(HKLM32,CrystalReportsKey))) or
(not IsWin64 and not RegKeyExists(HKLM, CrystalReportsKey))) then begin
        crNeeded:=true;
        memoDependenciesNeeded := memoDependenciesNeeded + '    Crystal Reports 13' #13;
         end;
end;

所以我正在检查我是在 32 位窗口还是 64 位窗口上运行。

如果在 64 位窗口上运行,我正在检查 HKLM 64 位视图上是否存在 regkey,如果密钥存在,则 var crNeeded 保持初始值为 false,如果不存在则我们需要检查 regkeys 的 32 位视图以防万一安装的 Crystal Reports 是 32 位可执行文件。 如果仍然没有 regkey,那么我们将变量 crNeeded 设置为 true,说明我们需要安装水晶报表。

我将 if 子句从 ProcessorArchitecture=paX64 更改为 IsWin64 ,因为 ProcessorArchitecture 正在检查处理器是 64 位还是 32 位,如果 64 位机器上有 32 位窗口,这可能会导致异常。

变量 crNeeded 将用于文件的检查功能,我的意思是只有当我们这个变量为真时才会安装。 再次感谢用户 TLama 的所有帮助... 谢谢..

【讨论】:

您没有介绍 64 位安腾架构。最好询问IsWin64 函数以检查您是否在 64 位系统上。而且正如我之前所说,不要直接访问Wow6432Node 节点。如果您想在 64 位系统上从 32 位注册表视图中读取,请从 HKLM32(或者如果您不使用 64 位 Inno Setup 模式,则只需 HKLM)根目录读取。我认为将我之前发布的the example 包装成一个函数,您可以编写something like this 好的,我将更改代码,有可能安装了 32 位窗口的 64 位机器。所以将处理器架构的检查更改为 iswin64,iswin64 是更好的选择检查。 好点!我完全错过了(甚至更糟)在 64 位机器上安装 32 位操作系统的可能性。从HKLM64 root 读取异常时会失败。 最后两件事要注意。您无需致电IsWin64 两次。当 else 分支评估为 false 时,您已经涵盖了该案例。并且像我一样更好地使用常量。现在,如果注册表项更改,您将需要在 3 个位置进行修改,而仅在一个位置保持不变。它真的像this generic IsCrystalReportsInstalled 函数一样简单。 [+1ed] 所以我需要添加不存在的regkey,因为如果key不存在我想更改crneed的值..

以上是关于.net 框架的 inno 设置检查 Sap Crystal 报告运行时引擎的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Inno Setup 安装 .NET 框架作为先决条件?

InnoSetup:检查 .NET Framework - 安装不工作

Inno Setup 安装程序运行时命名检查问题

MM配置SAP MM模块配置目录(转)

Inno设置加载字符串,获取数字并添加

Inno 安装 RegAsm.exe 错误