我在Inno安装过程中显示的Delphi DLL中构建了一些VCL表单。但是,如果我可以将这些表单嵌入到Inno Setup向导中,那将更加简洁。
我该怎么做呢?
答案 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端传递并执行它来实现。