Inno Setup中如何将组件大小从应用程序大小中剔除
解决方案
要实现主程序卸载大小仅显示自身大小,同时在组件选择环节展示每个组件的存储空间需求,可通过Inno Setup的脚本自定义实现,核心思路是放弃组件的ExtraDiskSpaceRequired参数,改用脚本动态显示组件大小并手动计算安装所需总空间,具体步骤如下:
1. 移除组件的ExtraDiskSpaceRequired参数
修改[Components]段,删除每个组件的该参数,避免其大小累加到主程序卸载大小中:
[Components] Name: "NETFrameworkComponent"; Description: ".NET Framework 4.8"; Types:compact full custom; Flags: fixed Name: "CodeMeterComponent"; Description: "Code Meter"; Types: full compact custom; Flags: fixed Name: "VisualStudioComponent"; Description: "Visual Studio Installer"; Types: full Name: "GoogleChromeComponent"; Description: "Google Chrome"; Types: full
2. 编写自定义脚本实现组件大小显示与空间计算
在[Code]段添加以下脚本,实现三个核心功能:格式化大小显示、动态修改组件描述添加大小、实时计算选中组件的总额外空间并更新安装磁盘空间提示:
const // 定义各组件的存储空间需求(单位:字节) NETFrameworkSize = 4718592000; CodeMeterSize = 108003328; VisualStudioSize = 2411724800; GoogleChromeSize = 361758720; // 格式化字节数为易读的GB/MB/KB格式 function FormatSize(Size: Int64): String; var KB, MB, GB: Double; begin KB := Size / 1024; MB := KB / 1024; GB := MB / 1024; if GB >= 1 then Result := Format('%.1f GB', [GB]) else if MB >= 1 then Result := Format('%.1f MB', [MB]) else Result := Format('%.1f KB', [KB]); end; // 初始化组件描述,添加大小信息并绑定事件 procedure InitializeWizard; var I: Integer; Component: TSetupComponent; begin // 遍历组件,修改描述添加大小 for I := 0 to WizardForm.ComponentsList.Items.Count - 1 do begin Component := WizardForm.ComponentsList.Components[I]; case Component.Name of 'NETFrameworkComponent': Component.Description := '.NET Framework 4.8 (' + FormatSize(NETFrameworkSize) + ')'; 'CodeMeterComponent': Component.Description := 'Code Meter (' + FormatSize(CodeMeterSize) + ')'; 'VisualStudioComponent': Component.Description := 'Visual Studio Installer (' + FormatSize(VisualStudioSize) + ')'; 'GoogleChromeComponent': Component.Description := 'Google Chrome (' + FormatSize(GoogleChromeSize) + ')'; end; end; // 绑定组件选择点击事件,实时更新磁盘空间 WizardForm.ComponentsList.OnClick := @ComponentsListClick; // 初始化磁盘空间显示 UpdateDiskSpaceLabel; end; // 计算选中组件的总额外存储空间 function GetSelectedComponentsExtraSize: Int64; var I: Integer; Component: TSetupComponent; begin Result := 0; for I := 0 to WizardForm.ComponentsList.Items.Count - 1 do begin Component := WizardForm.ComponentsList.Components[I]; if Component.Selected then begin case Component.Name of 'NETFrameworkComponent': Inc(Result, NETFrameworkSize); 'CodeMeterComponent': Inc(Result, CodeMeterSize); 'VisualStudioComponent': Inc(Result, VisualStudioSize); 'GoogleChromeComponent': Inc(Result, GoogleChromeSize); end; end; end; end; // 更新磁盘空间提示标签 procedure UpdateDiskSpaceLabel; var RequiredSpace, ExtraSpace: Int64; begin RequiredSpace := WizardForm.DiskSpaceRequiredLabel.CaptionAsInt; ExtraSpace := GetSelectedComponentsExtraSize; WizardForm.DiskSpaceLabel.Caption := Format('%s required', [FormatSize(RequiredSpace + ExtraSpace)]); end; // 组件选择时触发的事件 procedure ComponentsListClick(Sender: TObject); begin UpdateDiskSpaceLabel; end; // 准备安装阶段,将选中组件的额外空间加入磁盘空间检查 procedure CurStepChanged(CurStep: TSetupStep); var ExtraSpace: Int64; begin if CurStep = ssPrepare then begin ExtraSpace := GetSelectedComponentsExtraSize; WizardForm.DiskSpaceRequiredLabel.CaptionAsInt := WizardForm.DiskSpaceRequiredLabel.CaptionAsInt + ExtraSpace; end; end;
3. 效果说明
- 组件选择界面:每个组件的描述后会显示对应的存储空间大小(如
.NET Framework 4.8 (4.4 GB)) - 安装磁盘空间提示:会实时累加选中组件的总大小,确保安装时的空间检查准确
- 卸载程序大小:仅计算主程序安装后保留的文件大小,不会累加这些独立组件的存储空间——因为这些组件的安装包使用了
deleteafterinstall参数,安装后会被删除,且未通过ExtraDiskSpaceRequired参数将其大小计入主程序的卸载统计
内容的提问来源于stack exchange,提问作者Hugo_vdms
相关产品推荐
相关产品推荐

