Hug*_*lva 5 inno-setup crystal-reports
我目前正在尝试创建用于安装程序的自定义脚本。我需要检查是否安装了 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;
Run Code Online (Sandbox Code Playgroud)
所以这是将 var caleed crystallreportsneeded 更新为 true 或 false。此变量将用于文件的检查功能。我在控制面板上检查了运行时引擎是否已安装,但是每次我运行安装程序时,它都会尝试安装该文件。我错过了什么。,注册码正确吗?
经过一番搜索,我发现有些人没有搜索文件夹而是转到 HKLM->Windowns->CurrentVersion->Unistall 中的 uninstall 文件夹。在我的情况下,有一个带有产品代码的 sap 组件的寄存器,但是确实会产生问题,如果我通过网络更新 sap Crystal 报告的版本,然后尝试运行安装脚本,则会产生问题,即当前安装的版本比我当前尝试安装的版本新...
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);
Run Code Online (Sandbox Code Playgroud)
这个 1D8E6291-B0D5-35EC-8441-6616F567A0F7 在这种情况下是指应用程序 id vcc+...我也试过这个
RegQueryDWordValue(HKLM, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{{1D8E6291-B0D5-35EC-8441-6616F567A0F7}}', 'Version', version);
Run Code Online (Sandbox Code Playgroud)
它不显示消息,目前有 2 个选项,一个总是安装,两个检查文件是否存在 FileExists..所以任何帮助表示赞赏..
更新 - 15/10/2014 所以我想我找到了一个解决方法,我不认为这是一个解决方案,因为我无法解释正在发生的一些事情。需要在 32 位机器上进行测试,但我几乎可以肯定它也可以工作。目前我正在 64 位机器上使用 win 8.1 进行测试,我也会在 32 位上测试脚本。
所以我需要将脚本分开,一个用于 x32,另一个用于 x64。区别在于 [setup] 参数,如果设置是针对 64 位的,则需要以下 2 行:
ArchitecturesInstallIn64BitMode=x64
ArchitecturesAllowed=x64
Run Code Online (Sandbox Code Playgroud)
这些是描述:
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);
Run Code Online (Sandbox Code Playgroud)
这仅在您需要安装 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 setup 如何在 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;
Run Code Online (Sandbox Code Playgroud)
所以我正在检查我是否在 32 位 Windows 或 64 位 Windows 上运行。
如果在 64 位 Windows 上运行,我会检查 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 的所有帮助...谢谢..