对您来说最简单的方法是创建一个导出函数,它将执行库中的所有操作。此类功能所需的最低限度是应将表单嵌入其中的 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 端传递和执行它来实现。