调用DLL窗体-Delphi实例

(一)通过向导DLL Wizard新建一个动态链接库,取名为:DLLPro.dpr。说明:当在DLL工程文件中使用了String类型时,要有 uses ShareMem ,不过建议使用PChar类型。其代码如下:

library DLLPro; //编译生成DLLPro.dll文件。

uses

ActiveX,

Forms,

Windows,

SysUtils,

Classes,

DLLUnt in 'DLLUnt.pas';

{$R *.res}

var

DllApp:TApplication; //全局变量DLLApp默认初始化,即,DLLApp:=Application.

procedure CreateForm1(app:TApplication;parentform: TForm); export;stdcall;

var

Form1: TForm1;

begin

CoInitialize(nil);

try

Application:=app;

Form1:=Tform1.Create(parentform);

form1.MyParentForm:= parentform; //MyParentForm在DLLUnt.pas中定义为公共变量

form1.myparentApplication:=app; //MyParentApplication在DLLUnt.pas中定义为公共变量

Form1.Show;

finally

CoUninitialize;

end;

end;

procedure ExitDll(Reason:Integer);

begin

if Reason = DLL_PROCESS_DETACH then // DLL_PROCESS_DETACH值在DLL死亡时执行。

begin

Application:=DllApp;

end;

end;

exports

CreateForm1;

begin

DllApp:=Application; //该语句可以省略。

DllProc:=@ExitDll; //变量DllProc是SysUtils单元的一个Pointer类型的变量。

end.

<===============================================================================>

(二)创建DLL(动态链接库)的单元文件,取名为:DLLUnt.pas,该单元文件有与其配套的窗体文件DLLUnt.dfm;有一个ADOConnection1组件,必须定义在TForm1类中,否则编译时出错:Access Violence其部分代码如下:

unit DLLUnt;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ExtCtrls, StdCtrls, Buttons,ADODB,DB;

type

TForm1 = class(TForm)

Panel0: TPanel;

GroupBox1: TGroupBox;

Panel1: TPanel;

Panel2: TPanel;

………………

CheckBox891: TCheckBox;

Edit1: TEdit;

SpeedButton1: TSpeedButton;

ADOConnection1: TADOConnection;

procedure Edit1KeyPress(Sender: TObject; var Key: Char);

procedure SpeedButton1Click(Sender: TObject);

procedure Edit1Change(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

MyParentForm: TForm;

MyParentApplication: TApplication;

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

………………

procedure TForm1.SpeedButton1Click(Sender: TObject);

var

query:TADOquery;

Count,I,RedNum,J,CheckNum:integer;

RedName,LabName:string;

begin

if (edit1.Text='')or(length(edit1.Text)<7)or(StrToFloat(edit1.Text)<2008001) then

begin

showmessage('Error');

exit;

end;

query:=Tadoquery.Create(nil);

query.Connection:=ADOConnection1;

query.Close;

query.SQL.Clear;

query.SQL.Add('select * from gyWinNum where Id>='+quotedStr(edit1.Text)+' order by Id ');

query.Open;

Count:=1;

CheckNum:=0;

while (Not query.Eof)and(Count<28) do

………………

end.

<===============================================================================>

(三)创建项目主窗体的工程文件,取名:MainForm.dpr,其代码如下:

program MainPro; //编译生成MainPro.exe文件。

uses

Forms,

MainUnt in 'MainUnt.pas' {MainForm};

{$R *.res}

begin

Application.Initialize;

Application.CreateForm(TMainForm, MainForm);

Application.Run;

end.

<================================================================================>

(四)创建项目主窗体的单元文件,取名:MainUnt.pas,其代码如下:

unit MainUnt;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls,ADODB; //由于被调文件DLLPro.dll中含义数据集控件,在这里必须要有声明。

type

TMainForm = class(TForm)

Button1: TButton;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

MainForm: TMainForm;

implementation

{$R *.dfm}

procedure CreateForm1(app: TApplication;parentform: TForm);stdcall; external'DLLPro.dll';

procedure TMainForm.Button1Click(Sender: TObject);

begin

CreateForm1(Application,self);

end;

end.

<================================================================================>

另外:创建项目主窗体的单元文件,取名:MainUnt.pas,其代码也可以如下:

unit MainUnt;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls,adodb;

type

TMainForm = class(TForm)

Button1: TButton;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

T_CreateForm1=procedure(app: TApplication;parentform: TForm);stdcall; //定义T_CreateForm1类型

var

MainForm: TMainForm;

implementation

{$R *.dfm}

procedure TMainForm.Button1Click(Sender: TObject);

var

dllHandle: THandle;

Procaddr: FarProc;

CreateForm1: T_CreateForm1;

begin

dllHandle:=LoadLibrary('DLLPro');

Procaddr:=GetProcAddress(dllHandle,'CreateForm1');

if Procaddr <> nil then

begin

CreateForm1:=procaddr; //过程名,标识它的入口地址,是过程指针。

CreateForm1(Application,self);

end;

end;

end.

到此为止,结束。