如何将表单从DLL嵌入到Inno安装向导页面?

Jer*_*dge 3 embed delphi dll inno-setup

我已经在Inno安装过程中显示的Delphi DLL中构建了一些VCL表单.但是,如果我可以将这些表单嵌入到Inno Setup向导中,那将更加简洁.

我该怎么做呢?

TLa*_*ama 5

最简单的方法是创建一个导出的函数,它将完成库中的所有操作.此函数的必要最小值是Inno Setup控件的句柄的参数,应将表单嵌入到该控件中.嵌入时需要了解的下一个必要条件是绑定,但是可以通过Windows API函数调用那些在库侧调用.

这是Delphi部分,显示带有DLL项目表单的单元:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids;

type
  TEmbeddedForm = class(TForm)
    StringGrid1: TStringGrid;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  end;

procedure CreateEmbeddedForm(ParentWnd: HWND); stdcall;

implementation

{$R *.dfm}

{ TEmbeddedForm }

procedure TEmbeddedForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

{ CreateEmbeddedForm }

procedure CreateEmbeddedForm(ParentWnd: HWND); stdcall;
var
  R: TRect;
  Form: TEmbeddedForm;
begin
  Form := TEmbeddedForm.Create(nil);
  Form.ParentWindow := ParentWnd;
  Form.BorderStyle := bsNone;
  GetWindowRect(ParentWnd, R);
  Form.BoundsRect := R;
  Form.Show;
end;

exports
  CreateEmbeddedForm;

end.
Run Code Online (Sandbox Code Playgroud)

这是Inno安装脚本:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program

[Files]
Source: "MyDLL.dll"; Flags: dontcopy

[Code]
procedure CreateEmbeddedForm(ParentWnd: HWND);
  external 'CreateEmbeddedForm@files:MyDLL.dll stdcall';

procedure InitializeWizard;
var
  CustomPage: TWizardPage;
begin
  CustomPage := CreateCustomPage(wpWelcome, 'Caption', 'Description');
  CreateEmbeddedForm(CustomPage.Surface.Handle);
end;
Run Code Online (Sandbox Code Playgroud)

需要注意的是,Inno Setup也支持COM Automation,因此上述方法并不是如何将对象嵌入向导形式的唯一选择.但是,这是最简单的一个.

哦,还有一张纸条,可能对你有用.如果您需要从库中执行某个Inno Setup脚本代码,可以通过在Inno Setup端创建一个回调函数并在DLL端传递并执行它来实现.

  • @Sertac,例如[`this way`](http://pastebin.com/1mDe32JY).从通常的实现角度来看,它非常棘手,因为Inno Setup中定义的每个过程实际上都是隐藏对象的方法.当我试图回调时,我花了一些时间才意识到这一点.然后我记得脚本中的所有事件方法(甚至是你自己定义的那些)都是无对象的程序,因此必须有一个隐藏的对象将它们全部包装到方法中. (2认同)