如何通过DLL在Inno Setup中显示Delphi创建的FMX/VCL窗体?
解决Inno Setup调用FMX窗体DLL不显示的问题
首先,你的问题核心在于FMX框架需要在非FMX宿主程序中手动初始化运行时环境,而原始DLL代码没有做这一步,导致窗体无法正常创建显示。下面是具体的分析和解决方案:
问题原因
Inno Setup是基于VCL/WinAPI的程序,并非FMX宿主。直接在DLL中创建FMX窗体时,FMX的核心运行时(比如Application对象、消息循环绑定、资源初始化等)没有被正确初始化,所以窗体虽然被创建但无法显示。而你的CMD/VCL测试能正常运行,是因为测试程序可能间接触发了FMX初始化,或者VCL和FMX在某些环境下能共享部分初始化逻辑,但Inno Setup的环境不支持。
解决方案
1. 修改DLL代码,初始化FMX运行时
更新你的DLL代码,引入FMX.Forms单元,并在创建窗体前确保FMX应用环境已初始化:
library DLL; uses System.SysUtils, System.Classes, Winapi.Windows, Winapi.Messages, System.Variants, FMX.Forms, // 必须引入,用于初始化FMX应用 DLLForm in 'DLLForm.pas' {Form2}; {$R *.res} procedure ShowForm; stdcall; begin // 检查并初始化FMX应用环境 if not Assigned(Application) then begin Application.Initialize; end; Form2 := TForm2.Create(nil); try Form2.ShowModal; finally Form2.Free; end; end; Exports ShowForm; end.
2. 打包FMX依赖库到Inno Setup临时目录
FMX窗体依赖多个FMX动态库(比如FMX.Forms.dll、FMX.Controls.dll、FMX.StdCtrls.dll等),这些库需要和你的DLL一起放到Inno Setup的{tmp}目录,否则DLL加载时会找不到依赖。
更新Inno Setup的[Files]段:
[Setup] AppName=Windows AppPublisher=Stack AppVersion=1.0.0.0 DefaultDirName={pf}\FMXForm [Files] Source: Include\DLL.dll; DestDir: {tmp}; Flags: dontcopy; Source: Include\FMX.Forms.dll; DestDir: {tmp}; Flags: dontcopy; Source: Include\FMX.Controls.dll; DestDir: {tmp}; Flags: dontcopy; Source: Include\FMX.StdCtrls.dll; DestDir: {tmp}; Flags: dontcopy; # 根据你的窗体用到的控件,补充其他FMX依赖库(比如FMX.Objects.dll、FMX.Types.dll等) # 可以用Dependency Walker工具查看DLL的所有依赖,确保没有遗漏
3. 确保DLL位数与Inno Setup一致
- 如果你的Inno Setup编译的是32位安装程序,DLL必须编译为32位;
- 如果是64位安装程序,DLL必须编译为64位。
位数不匹配会导致DLL加载失败(虽然你的情况是无错误退出,但也需要确认这一点)。
测试验证
重新编译DLL和Inno Setup安装程序,运行后应该能正常弹出FMX窗体了。
内容的提问来源于stack exchange,提问作者bear
相关产品推荐
相关产品推荐

