Crystal reports inno安装检查Sap Crystal reports运行时引擎for.net framework
我目前正在尝试创建一个用于安装程序的自定义脚本。我需要检查crystal reports 13的运行时引擎是否已安装,如果未安装,则安装。 这就是我想做的: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
//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位。不客气!如果您愿意的话