Inno setup Inno设置:如何创建';检查:';用于当前安装的DirectX版本的函数,以及MS VC++;2005已安装

Inno setup Inno设置:如何创建';检查:';用于当前安装的DirectX版本的函数,以及MS VC++;2005已安装,inno-setup,Inno Setup,我正在创建一个自定义安装程序,大部分情况下,我都按照我想要的方式进行了设置,只是缺少了两个我想添加到设置中的功能。我已经做了一些广泛的搜索,虽然我发现了很多类似的问题,但我没有能够得到这些问题的答案,并根据我的具体需求对它们进行修改 基本上,我需要做的是为“Check:”创建一个自定义函数,用于检查当前安装的DirectX版本。我知道有“RegQueryStringValue”函数,并且我知道该项在包含该版本(HKLM\SOFTWARE\Microsoft\DirectX,version)的注册

我正在创建一个自定义安装程序,大部分情况下,我都按照我想要的方式进行了设置,只是缺少了两个我想添加到设置中的功能。我已经做了一些广泛的搜索,虽然我发现了很多类似的问题,但我没有能够得到这些问题的答案,并根据我的具体需求对它们进行修改

基本上,我需要做的是为“Check:”创建一个自定义函数,用于检查当前安装的DirectX版本。我知道有“RegQueryStringValue”函数,并且我知道该项在包含该版本(HKLM\SOFTWARE\Microsoft\DirectX,version)的注册表中的位置。我只是不知道如何实现代码来检查注册表中包含的版本,如果它报告的值小于4.09.00.0904,则继续执行我在[Files]下输入的DXSETUP

<>我也希望为VisualC++ 2005(x86)使用“检查”:我相信这将更简单,因为它只需要检查是否存在一个实际的键(RegQueryKey?),而不是一个值。我相信VC++2005的关键是HKLM\SOFTWARE\Microsoft\VisualStudio\8.0


如果有人能帮我的话,我会非常感激的,因为我已经花了好几个小时来处理这个问题,试图将一些功能整合起来,但没有取得多大成功。如果您需要我提供任何进一步的信息,我将非常乐意提供。

CodePrepareToInstall.iss
中有一个检查Inno安装中包含的先决条件的示例
InitializeSetup
显示如何检查注册表项是否存在,您可以在
DetectandInstallPremissions
中执行此操作。我添加了一个
CheckDXVersion
函数,您可以从DirectX注册表项中传递
Version
字符串,该字符串检查4.9或更高版本(未测试!),您也可以使用它

;--CodePrepareToInstall.iss--
;
; 此脚本显示如何使用PrepareToInstall事件函数
; 安装先决条件并处理其间的任何重新启动,同时记住
; 跨重新启动的用户选择。
[设置]
AppName=我的程序
AppVersion=1.5
DefaultDirName={pf}\My程序
DefaultGroupName=我的程序
卸载显示图标={app}\MyProg.exe
OutputDir=userdocs:Inno设置示例输出
[档案]
资料来源:“MyProg.exe”;DestDir:“{app}”;
资料来源:“MyProg.chm”;DestDir:“{app}”;
资料来源:“Readme.txt”;DestDir:“{app}”;旗帜:isreadme;
[图标]
名称:“{group}\My Program”;文件名:“{app}\MyProg.exe”
[守则]
常数
(***将以下内容自定义为您自己的姓名。***)
RunOnceName='我的程序安装程序重新启动';
QuitMessageReboot='必备程序的安装未完成。您需要重新启动计算机才能完成该安装。“#13#13”重新启动计算机后,下次管理员登录时,安装程序将继续。”;
QuitMessageError='错误。无法继续。”;
变量
重新启动:布尔;
函数InitializeSetup():Boolean;
开始
重新启动:=ExpandConstant(“{param:restart | 0}”)='1';
如果未重新启动,则开始
结果:=不存在RegValueExists(HKLM,'Software\Microsoft\Windows\CurrentVersion\RunOnce',RunOnceName);
如果没有结果的话
MsgBox(退出消息重新启动,mbError,mb_Ok);
结束其他
结果:=真;
结束;
函数CheckDXVersion(const-VerString:String):布尔值;
变量
主服务器、最小服务器:整数;
StartPos:整数;
TempStr:字符串;
开始
(*摘录主要版本*)
StartPos:=位置('.',对字符串);
主版本:=stroint(副本(VerString,1,StartPos-1);
(*删除后面的主版本和小数点*)
TempStr:=Copy(VerString,StartPos+1,MaxInt);
(*查找下一个小数点*)
StartPos:=位置('.',TempStr);
(*摘录次要版本*)
minserver:=Copy(TempStr,1,StartPos-1);
结果:=(主服务器>4)或((主服务器=4)和最小服务器>9));
结束;
函数先决条件:布尔;
开始
(***将您的先决条件检测和安装代码放在下面。***)
(***如果检测到缺少先决条件但安装失败,则返回False,否则返回True。***)
//
结果:=真;
(***删除以下块!此演示用于模拟需要重新启动的先决条件安装。***)
如果不重新启动,则
重新启动替换(ParamStr(0),“”);
结束;
函数引号(const S:String):字符串;
开始
结果:=''“+S+'”;
结束;
函数AddParam(常量S,P,V:String):String;
开始
如果V'''那么
结果:=S+'/'+P+'='+V;
结束;
函数AddSimpleParam(const S,P:String):String;
开始
结果:=S+'/'+P;
结束;
程序输入;
变量
数据:字符串;
开始
RunOnceData:=Quote(ExpandConstant('{srceexe}'))+'/restart=1';
RunOnceData:=AddParam(RunOnceData,'LANG',ExpandConstant('{language}');
RunOnceData:=AddParam(RunOnceData,'DIR',引号(WizardDirValue));
RunOnceData:=AddParam(RunOnceData,'GROUP',Quote(WizardGroupValue));
如果你不知道的话
RunOnceData:=AddSimpleParam(RunOnceData,'NOICONS');
RunOnceData:=AddParam(RunOnceData,'TYPE',引号(WizardSetupType(False));
RunOnceData:=AddParam(RunOnceData,'COMPONENTS',引号(WizardSelectedComponents(False));
RunOnceData:=AddParam(RunOnceData,“任务”,引号(WizardSelectedTasks(False));
(***在下面放置您想要记住的任何自定义用户选择。***)
//
RegWriteStringValue(HKLM,'Software\Microsoft\Windows\CurrentVersion\RunOnce',RunOnceName,RunOnceData);
结束;
函数PrepareToInstall(var NeedsRestart:Boolean):字符串;
变量
ChecksumBefore、ChecksumAfter:字符串;
开始
ChecksumBefore:=MakePendingFileRenameOperationsChecksum;
如果没有安装先决条件,则开始
ChecksumAfter:=MakePendingFileRenameOperationsChecksum;
如果以前检查过