You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 19:43:15