【发布时间】: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 位系统上没有这样的视图)。
标签: crystal-reports inno-setup