日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Delphi中高级DLL的编写和调用

發布時間:2025/3/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Delphi中高级DLL的编写和调用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
??
?
?
根據Delphi提供的有關 DLL編寫和調用的幫助信息,你可以很快完成一般的 DLL編寫和調用的 應用程序。本文介紹的主題是如何編寫和調用能夠傳遞各種參數(包括對象實例)的 DLL。例如, 主叫程序傳遞給 DLL一個ADOConnection 對象示例作為參數, DLL中的函數和過程調用通過該對象實例訪問數據庫。
需要明確一些基本概念。對于 DLL,需要在主程序中包含 exports子句,用于向外界提供調用 接口,子句中就是一系列函數或過程的名字。對于主叫方(調用 DLL的應用程序或其它的 DLL), 則需要在調用之前進行外部聲明,即external保留字指示的聲明。這些是編寫 DLL和調用 DLL必須 具備的要素。
另外需要了解Object Pascal 中有關調用協議的內容。在Object Pascal 中,對于過程和函數 有以下五種調用協議:
指示字參數傳遞順序參數清除者參數是否使用寄存器
register自左向右被調例程
pascal自左向右被調例程
cdecl自右向左調用者
stdcall自右向左被調例程
safecall自右向左被調例程
這里的指示字就是在聲明函數或過程時附加在例程標題之后的保留字,默認為register,即是 唯一使用 CPU寄存器的參數傳遞方式,也是傳遞速度最快的方式;
  • pascal: 調用協議僅用于向后兼容,即向舊的版本兼容;
  • cdecl: 多用于 C和 C++語言編寫的例程,也用于需要由調用者清除參數的例程;
  • stdcall: 和safecall主要用于調用Windows API 函數;其中safecall還用于雙重接口。

在本例中,將使用調用協議cdecl ,因為被調用的 DLL中,使用的數據庫連接是由主叫方傳遞 得到的,并且需要由主叫方處理連接的關閉和銷毀。

下面是 DLL完整源程序和主叫程序完整源程序。包括以下四個文件:
Project1.DPR {主叫程序}
Unit1.PAS {主叫程序單元}
Project2.DPR {DLL}
Unit2.PAS {DLL單元}


{---------- DLL 主程序 Project2.DPR ----------}

library Project2;

uses
SysUtils,
Classes,
Unit2 in 'Unit2.pas' {Form1};

{$R *.RES}

{ 下面的語句用于向調用該 DLL的程序提供調用接口 }
exports
DoTest; { 過程來自單元Unit2 }

begin
end.


{---------- DLL中的單元 Unit2.PAS ----------}

unit Unit2;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, ADODB, StdCtrls, Menus;

type
TForm1 = class(Tform)
ADOConnection1: TADOConnection;{ 本地數據庫連接 }
Memo1: Tmemo; { 用于顯示信息 }
private
public
end;

{ 該過程向外提供 }
procedure DoTest(H: Thandle; { 獲得調用者的句柄 }
Aconn: TADOConnection;{ 獲得調用者的數據庫連接 }
S: string; { 獲得一些文本信息 }
N: Integer); { 獲得一些數值信息 }
cdecl; { 指定調用協議 }

implementation

{$R *.DFM}

procedure DoTest(H: Thandle; Aconn: TADOConnection; S: string; N: Integer);
begin
Application.Handle := H; { 將過程的句柄賦值為調用者的句柄 }
{ 上面語句的作用在于, DLL的句柄和調用者的句柄相同,在任務欄中就不會 }
{ 各自出現一個任務標題了。 }
with TForm1.Create(Application) do try{ 創建窗體 }
Memo1.Lines.Append('成功調用'); { 顯示一行信息 }
ADOConnection1 := Aconn; { 獲得數據庫連接的實例 }
Memo1.Lines.Append(
ADOConnection1.ConnectionString +
' - ' + S + ' - ' + IntToStr(N)); { 根據得到的參數顯示另一行信息 }
ShowModal; { 模式化顯示窗體 }
finally
Free; { 調用結束時銷毀窗口 }
end;
end;

end.


{---------- 調用者 Project1.DPR,很普通的工程文件 ----------}

program Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.


{---------- 調用者單元Unit1.PAS ----------}

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Db, ADODB;

type
TForm1 = class(Tform)
Button1: Tbutton; { 按此按鈕進行調用 }
ADOConnection1: TADOConnection; { 本地數據庫連接,將傳遞給 DLL }
procedure Button1Click(Sender: Tobject);{ 調用 DLL}
private
public
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

{ 外部聲明必須和 DLL中的參數列表一致,否則會運行時錯誤 }
procedure DoTest(H: Thandle; { 傳遞句柄 }
Aconn: TADOConnection; { 傳遞數據庫連接 }
S: string; { 傳遞文本信息 }
N: Integer); { 傳遞數值信息 }
cdecl; { 指定調用協議 }
external 'Project2.dll';{ 指定過程來源 }

{ 調用過程 }
procedure TForm1.Button1Click(Sender: Tobject);
begin
DoTest(Application.Handle,
ADOConnection1,
'Call OK',
256);
end;

end.
 

總結

以上是生活随笔為你收集整理的Delphi中高级DLL的编写和调用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。