代码之家  ›  专栏  ›  技术社区  ›  Jerry Dodge

如何将DLL中的表单嵌入Inno Setup向导页面?

  •  3
  • Jerry Dodge  · 技术社区  · 12 年前

    我在Delphi DLL中构建了一些VCL表单,这些表单在Inno Setup安装过程中显示。然而,如果我能将这些表单嵌入Inno Setup向导中,那就更加简洁了。

    我该怎么做呢?

    1 回复  |  直到 12 年前
        1
  •  5
  •   TLama    12 年前

    对您来说,最简单的方法是创建一个导出函数,该函数将执行库中的所有内容。该函数所需的最小值是Inno Setup控件句柄的一个参数,表单应嵌入其中。对于嵌入,您需要知道的下一个必要的事情是边界,但这些可以通过库端的WindowsAPI函数调用获得。

    下面是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脚本:

    [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端传递和执行它来实现。