Inno Setup:在设置过程中重新启动不会在重新启动后启动



我已经使用Inno Setup制作了一个安装程序,我需要在运行某些文件后重新启动计算机,所以我使用了这篇文章中的解决方案。

inno 安装示例"CodePrepareToInstall.iss"工作正常,所以我在测试安装中使用了代码,但我的安装程序在之后没有启动计算机重新启动。

两个安装程序(inno demo和我的测试)都在"HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce"中添加了一个注册表项,唯一的区别是附加值。我的刺痛比inno演示中添加的字符串要长得多。

注册表/运行时是否有值限制?

Inno Demo Value:
"C:UsersAdminDocumentsInno Setup Examples Outputsetup.exe" /restart=1 /LANG=default /DIR="C:Program Files (x86)My Program" /GROUP="My Program"
My Installer Value:
"C:UsersAdminDocumentsInno Setup ProjekteTreiber TestbinDriver Test Setup.exe" /restart=1 /LANG=german /DIR="C:Driver" /GROUP="Driver Test Setup" /TYPE="full" /COMPONENTS="1234driverinstaller,audio,bluetooth,chipset,devicepowermanager,gps,inputmanagementservice,modem,lan,1234powerplan,touchscreen,vga,wlan,wwan,1234products"

通了。Windows 对从 HKLU 或 HKLM 中的 RunOnce 注册表运行的命令有 256 个字符的限制。

所以我决定创建一个批处理文件来启动我的安装程序,然后自行删除它。因此,我只需要将批处理的路径传递给 RunOnce 注册表。

InnoScript:

procedure CreateRunOnceEntry;
var
    RunOnceData: String;
begin
    RunOnceData := 'echo off' + #13#10;
    RunOnceData := RunOnceData + 'start "" ';
    RunOnceData := RunOnceData + Quote(ExpandConstant('{srcexe}')) + ' /restart=1';
    RunOnceData := AddParam(RunOnceData, 'LANG', ExpandConstant('{language}'));
    RunOnceData := AddParam(RunOnceData, 'DIR', Quote(WizardDirValue));
    RunOnceData := AddParam(RunOnceData, 'GROUP', Quote(WizardGroupValue));
    if WizardNoIcons then
        RunOnceData := AddSimpleParam(RunOnceData, 'NOICONS');
    RunOnceData := AddParam(RunOnceData, 'TYPE', Quote(WizardSetupType(False)));
    RunOnceData := AddParam(RunOnceData, 'COMPONENTS', Quote(WizardSelectedComponents(False)));
    RunOnceData := AddParam(RunOnceData, 'TASKS', Quote(WizardSelectedTasks(False)));
    RunOnceData := RunOnceData + #13#10 + 'start /b cmd.exe /c del %0' + #13#10 + 'exit';
    SaveStringToFile(ExpandConstant('{commonappdata}StartInstallation.cmd'), RunOnceData, True);
    if not IsWin64 then
        RegWriteStringValue(HKLM, 'SoftwareMicrosoftWindowsCurrentVersionRunOnce', RunOnceName, ExpandConstant('{commonappdata}StartInstallation.cmd'));
    if IsWin64 then
        RegWriteStringValue(HKLM, 'SoftwareWow6432NodeMicrosoftWindowsCurrentVersionRunOnce', RunOnceName, ExpandConstant('{commonappdata}StartInstallation.cmd'));
end;

批处理文件:

echo off
start "" "C:UsersAdminDocumentsInno Setup ProjekteTreiber TestbinDriver Test Setup.exe" /restart=1 /LANG=german /DIR="C:Driver" /GROUP="Driver Test Setup" /TYPE="full" /COMPONENTS="1234driverinstaller,audio,bluetooth,chipset,devicepowermanager,gps,inputmanagementservice,modem,lan,1234powerplan,touchscreen,vga,wlan,wwan,1234products"
start /b cmd.exe /c del %0
exit

最新更新