調用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.

到此為止,結束。

 
 
 
好文要頂 關注我 收藏該文

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM