DELPHI 中動態鏈結庫的使用

2021-04-01 19:30:22 字數 2258 閱讀 7088

delphi中,有兩種方法可用於呼叫乙個儲存在dll(動態鏈結庫)中的過程。

----一、 呼叫方法

---- 1、 靜態呼叫或顯式裝載使用乙個外部宣告子句,使dll在應用程式開始執行前即被裝入。例如:

function instring (sourcestr: pchar ;

check: char): integer; far; external 『 demostr』

---- 這種方式要在單元的inte***ce 部分用external 指示字列出要從dll中呼叫的例程。far 指令表明可以被其他段,例如其他單元呼叫的子例程。所有在單元介面中宣告的子例程在預設情況下都是far型別的,其相反的指令是near。

---- 如果external 後什麼也不跟,必須用 編譯指令預先指定乙個dll名字,如:

procedure setstring(var str: string) ;

stdcall ; external

---- 但是使用靜態呼叫方法時,程式無法在執行時間裡決定dll的呼叫。在delphi中使用dll時,例程的識別符號必須與dll中相應輸出例程的識別符號完全一致(儘管delphi本身大小寫不敏感)。

---- 2、 動態呼叫或隱式裝入

---- 使用windows api 函式 loadlibrary 和getprocaddress可以實現在執行時間裡的動態裝載dll,並呼叫其中的過程。

---- 例如:

type tmyproc=procedure (param:pchar ) ;stdcall;

var myproc: tmyproc;

myhandle:thandle;

myhandle:=loadlibrary (『mydll』) ;

if myhandle< =0 then

raise exception.create

( 『動態鏈結庫呼叫失敗,錯誤**

是:』+inttostr(getlasterror))

else

@myproc:=getprocaddress(myhandle,』demoproc』);

if not assigned(myproc) then

raise exception.create('getprocaddress

呼叫失敗,錯誤**

是:』+inttostr(getlasterror))

else myproc(pchar(『a string』));

freelibrary(myhandle); // 解除安裝dll

----二、 呼叫方式

---- 1、 通過過程、函式名;

---- 2、 通過過程、函式別名;

---- 3、 通過過程、函式的順序號

---- 例:function getstring : string ; stdcall ; external 『mydlls.dll』 name 『mygetstr』name 子句指定函式名getstring 改為mygetstr,當程式呼叫這個例程時,使用mygetstr這個名字;function getstring : string ; stdcall ; external 『mydlls.dll』 index 5 index 子句通過索引號引入例程可以減少dll的載入時間。

----三、 呼叫約定

---- 呼叫約定,是指呼叫例程時引數的傳遞順序。delphi中dll支援的呼叫約定有:

呼叫約定	引數傳遞順序

register 從左到右

pascal 從左到右

stdcall 從右到左

cdecl 從右到左

safecall 從右到左

---- 使用stdcall 方式,能保證不同語言寫的dll的相容性,同時它也是windows api的約定方式;delphi3。0、4。0的預設呼叫方式為register ;cdecl是採用 c/c++的呼叫約定,適用於dll是由c++語言編寫的;safecall 是適合於宣告ole物件中的方法。

----四、 dll中的變數和段

---- 乙個dll宣告的任何變數都為自己私有 ,呼叫它的模組不能直接使用它定義的變數。要使用時必須通過過程或函式介面才能完成,對dll來說,它永遠都沒有機會使用呼叫它的模組中的宣告的變數。乙個dll沒有自己的ss(堆疊段),它使用呼叫它的應用程式的堆疊。因此在dll中的過程、函式不要假定ds=ss(ds為資料段)。

Delphi 製作 dll 動態鏈結庫

delphi 製作 dll 動態鏈結庫,封裝常用的函式。1,建立 dll 檔案 建立工程 檔案 mydll.dpr library mydll uses sysutils,classes,graphics,controls,forms,dialogs,stdctrls procedure mymsg...

動態鏈結庫使用 靜 動態鏈結庫使用總結

一 靜態庫編寫 1.首先當然是開vs然後建立乙個靜態庫工程啦 2.格式.一般有標頭檔案.h和原檔案.cpp,當然你也可以寫一在乙個cpp裡.mydll.h extends c mydll.cpp include mylib.h int sum int num1,int num2 int mult i...

使用動態鏈結庫

1.動態鏈結庫是程式執行時載入的庫,當動態鏈結庫正確安裝後,所有的程式都可以使用動態庫來執行程式。動態鏈結庫是目標檔案的集合,目標檔案在動態鏈結庫中的組織方式是按照特殊方式形成的。庫中函式和變數的位址是相對位址,不是絕對位址,其真實位址在呼叫動態庫的程式載入時形成。2.動態鏈結庫的名稱有別名 son...