Crystal reports inno安装检查Sap Crystal reports运行时引擎for.net framework

Crystal reports inno安装检查Sap Crystal reports运行时引擎for.net framework,crystal-reports,inno-setup,Crystal Reports,Inno Setup,我目前正在尝试创建一个用于安装程序的自定义脚本。我需要检查crystal reports 13的运行时引擎是否已安装,如果未安装,则安装。 这就是我想做的: //check crystalReports if (not RegKeyExists(HKLM, 'Software\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Crystal Reports')) then begin crystalRep

我目前正在尝试创建一个用于安装程序的自定义脚本。我需要检查crystal reports 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计算的CrystalReports,该报告被指定为true或false。 此变量将用于文件的check函数。 我已在控制面板上检查运行时引擎是否已安装,但每次运行安装程序时,它都会尝试安装该文件。 我遗漏了什么,注册表项正确吗

经过一段时间的搜索,我发现有些人没有搜索该文件夹,而是转到HKLM->Windowns->CurrentVersion->Unistall中的uninstal文件夹。。 在我的情况下,有一个带有产品代码的sap组件注册表,但这确实会产生问题,如果我通过web更新sap crystal reports的版本,然后尝试运行安装脚本,则会产生问题,其中当前安装的版本比我当前尝试安装的版本更新

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

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);
它没有显示消息,, 目前有两个选项,一个总是安装,两个用FileExists检查文件是否存在。因此非常感谢您的帮助

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

所以我需要将脚本分开,一个用于x32,另一个用于x64。 差异在[setup]参数中,如果设置为64位,则需要以下两行:

ArchitecturesInstallIn64BitMode=x64
ArchitecturesAllowed=x64
以下是描述:

ArchitecturesAllowed=x64指定安装程序只能在x64上运行。 ArchitecturesInstallIn64BitMode=x64“请求安装 在x64上以“64位模式”完成,这意味着它应该使用本机 64位程序文件目录和注册表的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);
只有在需要安装crystal reports运行时引擎64位时,才会发生这种情况。 在我的脚本上,我正在检查是否安装了sql server,如果不存在,请安装

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

如果有新的情况更新,我会更新后。。。
提前感谢。

感谢用户TLama,这解释了inno安装程序如何在64位机器上工作。。 以下是检查crystal reports运行时引擎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位windows上运行还是在64位windows上运行

如果在64位windows上运行,我将检查HKLM 64位视图上是否存在regkey,如果该键存在,则var crNeeded将保持初始值false,如果不存在,则我们需要检查regkey的32位视图,以防Crystal Reports安装为32位可执行文件。 如果仍然没有regkey,那么我们将变量crNeeded设置为true,说明我们需要安装crystal reports

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

crNeeded变量将用于文件的check函数,我的意思是,只有当这个变量为true时,它才会安装。 再次感谢用户TLama提供的所有帮助。。。
谢谢..

如果您将在64位Windows上运行(
IsWin64
函数可以告诉您这一点),并且您的安装程序将在32位模式下运行(如果您省略
架构安装64位模式
指令),您可以使用
HKLM64
根键访问64位注册表视图。注册表上有两个视图,32位和64位。由于Inno Setup是32位应用程序,因此默认情况下它映射到32位注册表视图,并且如您所述,您要查找的注册表项存储在64位注册表视图中(如果运行64位regedit,这是在非Wow节点下可以看到的,这是64位Windows上的默认值)。我认为在64位系统上,您应该检查这两个视图是否存在密钥,因为在64位系统上,您可以安装32位或64位Crystal Reports,不是吗?我相信32位CR将写入32位注册表视图,64位写入64位。这取决于您正在查看的注册表项。系统上有两个注册表项。一个是32位a第二个是64位。默认情况下,会打开64位视图,其中64位视图显示为普通树,32位视图显示为
Wow6432Node
下的32位视图。32位视图则相反。您不能直接访问
Wow6432Node
节点。您拥有重定向器。Inno安装程序允许您访问这两个视图。如果e在32位模式下运行它(不带
架构安装64位模式
指令),
HKLM
(或
HKLM32
)映射到32位注册表视图,而
HKLM64
映射到64位。不客气!如果您愿意的话