Inno Setup:在安装过程中重新启动不会在重新启动后启动
Inno Setup: restart during setup process won't start after reboot
我已经使用 Inno Setup 制作了一个安装程序,在一些文件被删除后我需要重新启动计算机 运行,
所以我使用了 this post.
的解决方案
inno setup sample 'CodePrepareToInstall.iss' 工作正常,所以我使用代码进行测试安装,但我的安装程序在之后没有启动
计算机重新启动。
两个安装程序(inno demo 和我的测试)都在“HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce”中添加了一个注册表项,唯一的区别是
附加值。我的 sting 比 inno demo 添加的字符串长得多。
registry/runonce是否有值长度限制?
Inno Demo Value:
"C:\Users\Admin\Documents\Inno Setup Examples Output\setup.exe" /restart=1 /LANG=default /DIR="C:\Program Files (x86)\My Program" /GROUP="My Program"
My Installer Value:
"C:\Users\Admin\Documents\Inno Setup Projekte\Treiber Test\bin\Driver 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, 'Software\Microsoft\Windows\CurrentVersion\RunOnce', RunOnceName, ExpandConstant('{commonappdata}\StartInstallation.cmd'));
if IsWin64 then
RegWriteStringValue(HKLM, 'Software\Wow6432Node\Microsoft\Windows\CurrentVersion\RunOnce', RunOnceName, ExpandConstant('{commonappdata}\StartInstallation.cmd'));
end;
批处理文件:
echo off
start "" "C:\Users\Admin\Documents\Inno Setup Projekte\Treiber Test\bin\Driver 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
我已经使用 Inno Setup 制作了一个安装程序,在一些文件被删除后我需要重新启动计算机 运行, 所以我使用了 this post.
的解决方案inno setup sample 'CodePrepareToInstall.iss' 工作正常,所以我使用代码进行测试安装,但我的安装程序在之后没有启动 计算机重新启动。
两个安装程序(inno demo 和我的测试)都在“HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce”中添加了一个注册表项,唯一的区别是 附加值。我的 sting 比 inno demo 添加的字符串长得多。
registry/runonce是否有值长度限制?
Inno Demo Value:
"C:\Users\Admin\Documents\Inno Setup Examples Output\setup.exe" /restart=1 /LANG=default /DIR="C:\Program Files (x86)\My Program" /GROUP="My Program"
My Installer Value:
"C:\Users\Admin\Documents\Inno Setup Projekte\Treiber Test\bin\Driver 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, 'Software\Microsoft\Windows\CurrentVersion\RunOnce', RunOnceName, ExpandConstant('{commonappdata}\StartInstallation.cmd'));
if IsWin64 then
RegWriteStringValue(HKLM, 'Software\Wow6432Node\Microsoft\Windows\CurrentVersion\RunOnce', RunOnceName, ExpandConstant('{commonappdata}\StartInstallation.cmd'));
end;
批处理文件:
echo off
start "" "C:\Users\Admin\Documents\Inno Setup Projekte\Treiber Test\bin\Driver 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