Inno setup Inno安装程序:安装.NET framework,重新启动系统并继续安装

Inno setup Inno安装程序:安装.NET framework,重新启动系统并继续安装,inno-setup,pascalscript,Inno Setup,Pascalscript,我需要安装一些系统先决条件,在完成它们之后重新启动系统,然后它必须在我停止的地方继续安装。先决条件是.NET framework和Windows更新 我的[code]部分: const (***将以下内容自定义为您自己的姓名。***) RunOnceName='我的程序安装程序重新启动'; QuitMessageReboot='Os requisitos para a installaço do sistema não estão completos。精确的计算机系统安装连续性。“13”计算机系

我需要安装一些系统先决条件,在完成它们之后重新启动系统,然后它必须在我停止的地方继续安装。先决条件是.NET framework和Windows更新

我的
[code]
部分:

const
(***将以下内容自定义为您自己的姓名。***)
RunOnceName='我的程序安装程序重新启动';
QuitMessageReboot='Os requisitos para a installaço do sistema não estão completos。精确的计算机系统安装连续性。“13”计算机系统安装连续性安装连续性安装连续性安装连续性安装系统;
QuitMessageError='错误。无法继续。”;
变量
重新启动:布尔;
结果代码:整数;
函数InitializeSetup():Boolean;
开始
重新启动:=ExpandConstant(“{param:restart | 0}”)='1';
如果未重新启动,则开始
结果:=不存在RegValueExists(HKLM,'Software\Microsoft\Windows\CurrentVersion\RunOnce',RunOnceName);
如果没有结果的话
MsgBox(退出消息重新启动,mbError,mb_Ok);
结束其他
结果:=真;
结束;
函数先决条件:布尔;
开始
(***将您的先决条件检测和安装代码放在下面。***)
(***如果检测到缺少先决条件但安装失败,则返回False,否则返回True。***)
如果不执行(ExpandConstant(“{tmp}\dotNetFx40_Full_x86_x64.exe”)、“/q/norestart”、“SW_SHOW、ewwaitunterminated、ResultCode),则
开始
MsgBox(QuitMessageReboot+IntToStr(ResultCode)+'..',
b错误,b_正常);
结束;
结果:=真;
结束;
函数引号(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;
如果先检查后检查,然后开始
创建新条目;
NeedsRestart:=真;
结果:=QuitMessageReboot;
结束;
结束其他
结果:=QuitMessageError;
结束;
函数ShouldSkipPage(PageID:Integer):布尔值;
开始
结果:=重新启动;
结束;
返回值是与值为
2
ResultCode
串联的变量
QuitMessageReboot

dotNetFx40\u Full\u x86\u x64.exe
由以下人员安装:

[Files]
;.Net Framework
Source: "Dependencias\.Net Framework\dotNetFx40_Full_x86_x64.exe"; DestDir: "{tmp}"; \
    Flags: deleteafterinstall
顾名思义,安装之前会发生故障。这些文件尚未安装。所以
Exec
显然失败了,因为没有什么可执行的

您可以使用以下方法从代码中提取
dotNetFx40\u Full\u x86\u x64.exe

[文件]
来源:“…\dotNetFx40_Full_x86_x64.exe”;标志:dontcopy
[守则]
函数先决条件:布尔;
变量
结果代码:整数;
成功:布尔;
开始
提取临时文件('dotNetFx40_Full_x86_x64.exe');
WizardForm.PreparingLabel.Caption:=“正在安装.NET framework…”;
WizardForm.PreparingLabel.Visible:=真;
尝试
成功:=
执行官(
ExpandConstant({tmp}\dotNetFx40_Full_x86_x64.exe'),“/q/norestart',”,
SW_SHOW、ewwaitunterminated、ResultCode);
最后
WizardForm.PreparingLabel.Caption:='';
WizardForm.PreparingLabel.Visible:=False;
结束;
如果不成功的话
...
结束;

确保将添加到
[Files]
部分条目中。

问题是什么?您似乎已经完成了所有的工作。删除参数以便能够“查看”安装,但只是不启动,以及我在帖子中提到的错误。进程输入if并生成错误代码2。那么您看到的是对
QuitMessageReboot
的三个引用中的哪一个?错误代码2是
文件\u未找到
。更改
QuitMessageReboot
的三种用法,这样您就可以知道是哪个代码区域导致了问题,然后您就可以问一个与该代码区域相关的更具体的问题。好吧,这样就失败了,对吗
Exec(ExpandConstant({tmp}\dotNetFx40_Full_x86_x64.exe)
您向我们展示的脚本中没有创建/提取/安装
{tmp}的代码\dotNetFx40_Full_x86_x64.exe
。它是如何创建的?@MartinPrikryl我将把问题编辑到插入文件的部分。我的安装程序不完整,它没有安装这些要求,也没有要求重新启动。调试我发现问题的示例代码…如果:if ChecksumBefore ChecksumAfter…测试检查如果依赖项安装程序(.NET framework)进行了需要重新启动的更改。可能没有需要重新启动的更改(可能您已经安装了框架)。好的,很好。I