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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:49:28