Inno Setup如何实现向多款应用选择性安装对应插件文件
Inno Setup 多目标模拟器动态安装实现方案
无需为每款飞行模拟器单独制作安装包,通过Inno Setup原生能力即可实现单安装包适配多目标应用的逻辑,具体实现步骤如下:
- 第一步:定义全局状态变量,提前完成模拟器安装检测
在[Code]区段声明全局变量存储用户选择的目标模拟器、各模拟器的实际安装路径,在安装初始化阶段通过注册表、默认安装路径规则检测3款飞行模拟器的安装状态,将检测到的安装路径存入数组,未检测到的模拟器对应路径值留空。
示例代码框架:
[Code] var TargetSimType: Integer; // 1=微软模拟飞行 2=Prepar3D 3=X-Plane,可按实际目标调整 SimInstallPath: array[1..3] of string; function InitializeSetup(): Boolean; begin // 此处写入实际检测逻辑,例如从注册表读取对应模拟器的安装根目录 // 例:RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Microsoft Games\Flight Simulator', 'SetupPath', SimInstallPath[1]); // 未检测到的模拟器将对应数组下标值设为空字符串即可 Result := True; end;
- 第二步:实现自定义选择向导页
在欢迎页的NextButtonClick事件中判断检测到的已安装模拟器数量:仅检测到1款时直接给TargetSimType赋值、自动设置对应安装路径,跳过选择页;检测到多款时渲染单选选择页,由用户自主选择目标安装模拟器,用户确认选择后直接将安装目录输入框的值替换为对应模拟器的地景目标安装路径,同时动态修改AppId等需要差异化的配置参数。 - 第三步:用
Check参数实现[Files]区段的条件复制逻辑[Files]区段原生支持Check参数,参数值为返回布尔值的代码表达式/函数,只有返回True时对应文件/文件组才会被复制,这就是你需要的条件判断通用参数。
你只需要给不同模拟器的专属文件加上对应判断条件即可,公共通用文件不需要加Check参数,会在所有安装场景下复制:
[Files] ; 全模拟器通用公共文件 Source: "Common\*"; DestDir: "{app}"; Flags: recursesubdirs createallsubdirs ; 仅微软模拟飞行需要的专属地景文件 Source: "MSFS\*"; DestDir: "{app}\Community\YourScenery"; Flags: recursesubdirs createallsubdirs; Check: TargetSimType = 1 ; 仅Prepar3D需要的专属地景文件 Source: "P3D\*"; DestDir: "{app}\Addon Scenery\YourScenery"; Flags: recursesubdirs createallsubdirs; Check: TargetSimType = 2 ; 仅X-Plane需要的专属地景文件 Source: "XPlane\*"; DestDir: "{app}\Custom Scenery\YourScenery"; Flags: recursesubdirs createallsubdirs; Check: TargetSimType = 3
- 补充说明:之前尝试用
[Components]/[Tasks]实现失败,核心原因是没有在用户选定目标模拟器后同步更新组件/任务的选中状态,相比之下全局变量+Check参数的方案逻辑链路更短,不需要额外维护组件、任务和目标应用的映射关系,后续迭代新增支持模拟器时,只需要新增枚举值、补充检测逻辑、添加对应文件条目即可,维护成本远低于多安装包方案。
内容的提问来源于stack exchange,提问作者Hannes Schmid
相关产品推荐
相关产品推荐

