在delphi中,有兩種方法可用於呼叫乙個儲存在dll(動態鏈結庫)中的過程。
----一、 呼叫方法
---- 1、 靜態呼叫或顯式裝載使用乙個外部宣告子句,使dll在應用程式開始執行前即被裝入。例如:
function instring (sourcestr: pchar ;---- 這種方式要在單元的inte***ce 部分用external 指示字列出要從dll中呼叫的例程。far 指令表明可以被其他段,例如其他單元呼叫的子例程。所有在單元介面中宣告的子例程在預設情況下都是far型別的,其相反的指令是near。check: char): integer; far; external 『 demostr』
---- 如果external 後什麼也不跟,必須用 編譯指令預先指定乙個dll名字,如:
---- 但是使用靜態呼叫方法時,程式無法在執行時間裡決定dll的呼叫。在delphi中使用dll時,例程的識別符號必須與dll中相應輸出例程的識別符號完全一致(儘管delphi本身大小寫不敏感)。procedure setstring(var str: string) ;
stdcall ; external
---- 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支援的呼叫約定有:
呼叫約定 引數傳遞順序---- 使用stdcall 方式,能保證不同語言寫的dll的相容性,同時它也是windows api的約定方式;delphi3。0、4。0的預設呼叫方式為register ;cdecl是採用 c/c++的呼叫約定,適用於dll是由c++語言編寫的;safecall 是適合於宣告ole物件中的方法。register 從左到右
pascal 從左到右
stdcall 從右到左
cdecl 從右到左
safecall 從右到左
----四、 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...