Inno Setup多UpdateReadyMemo事件共存:无需修改第三方代码的方案咨询
解决Inno Setup多模块共同生成Ready to Install页面内容的问题
问题背景
我使用Inno Setup 6.2,需要给*"Ready to Install"*页面添加自定义内容,因此实现了UpdateReadyMemo函数:
function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;
按文档说明,该函数返回值即为页面显示内容,原本运行正常。但引入第三方组件InnoDependencyInstaller后,它也通过事件标识符注册了同名事件:
<event('UpdateReadyMemo')> function Dependency_Internal3(const Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;
根据Inno Setup规则,这类事件会按注册顺序执行,只要某个事件返回非空字符串就会终止后续调用,导致无法让多个模块共同生成摘要内容。目前我是移除第三方组件的事件标识符,手动调用其内部函数来合并内容,但想找无需修改第三方组件的更好方法。
无需修改第三方组件的解决方案
方案1:直接操作ReadyMemo控件(最稳定)
跳过UpdateReadyMemo事件机制,在CurPageChanged事件中直接修改页面控件内容。当页面切换到Ready to Install时,先获取已生成的内容(包含第三方组件添加的部分),再追加自定义内容:
procedure CurPageChanged(CurPageID: Integer); var OriginalContent: String; begin if CurPageID = wpReady then begin // 获取当前摘要框已有的内容 OriginalContent := WizardForm.ReadyMemo.Text; // 追加自定义内容(换行符用#13#10对应Windows的回车换行) WizardForm.ReadyMemo.Text := OriginalContent + #13#10#13#10 + '* 自定义内容:' + #13#10 + ' ' + '这里是你要添加的额外信息'; end; end;
这个方法完全不依赖UpdateReadyMemo事件的执行顺序,不管第三方组件怎么处理事件,都能确保自定义内容被添加,且无需修改第三方代码。
方案2:利用GetPreviousEventResult合并事件返回值
如果坚持使用UpdateReadyMemo事件,可以用Inno Setup内置的GetPreviousEventResult函数获取前一个同事件的返回结果,实现内容拼接。需要注意你的事件要在第三方组件事件之后注册(即把你的[Code]段放在引入第三方组件的#include语句之后):
function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String; var ThirdPartyContent: String; begin // 获取第三方组件UpdateReadyMemo事件的返回内容 ThirdPartyContent := GetPreviousEventResult; // 拼接第三方内容与自定义内容,可自行调整顺序 Result := ThirdPartyContent + NewLine + NewLine + '* 自定义内容:' + NewLine + Space + '这里是你要添加的额外信息'; end;
这个方案依赖事件注册顺序,若第三方组件的事件先执行,就能拿到它的返回值进行合并。
内容的提问来源于stack exchange,提问作者TomB
相关产品推荐
相关产品推荐

