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

时间:2014-02-15 08:39:03

标签: delphi dll embed inno-setup

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

我该怎么做呢?

1 个答案:

答案 0 :(得分: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.

这是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;

请注意,Inno Setup也支持COM Automation,因此上述方法并不是如何将对象嵌入向导表单的唯一选项。但是,这是最简单的一个。

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