10.2.1.6 編寫一般DLLs的應用舉例
在下面的程序中我們把一個字符串操作的函數(shù)儲存到一個DLLs中,以便需要的時候調用它。應該注意的一點是:為了保證這個函數(shù)可以被其它語言編寫的程序所調用,作為參數(shù)傳遞的字符串應該是無結束符的字符數(shù)組類型(即PChar類型),而不是Object Pascal的帶結束符的Srting類型。程序清單如下:
library Example;
uses
SysUtils,
Classes;
{返回字符在字符串中的位置}
function InStr(SourceStr: PChar;Ch: Char): Integer; export;
var
Len,i: Integer;
begin
Len := strlen(SourceStr);
for i := 0 to Len-1 do
if SourceStr[i] = ch then
begin
Result := i;
Exit;
end;
Result := -1;
end;
exports
Instr Index 1 name 'MyInStr' resident;
begin
end.
10.2.2 調用DLLs
有兩種方法可用于調用一個儲存在DLLs中的過程。
1.靜態(tài)調用或顯示裝載
使用一個外部聲明子句,使DLLs在應用程序開始執(zhí)行前即被裝入。例如:
function Instr(SourceStr : PChar;Check : Char); Integer; far; external 'UseStr';
使用這種方法,程序無法在運行時間里決定DLLs的調用。假如一個特定的DLLs在運行時無法使用,則應用程序將無法執(zhí)行。
2.動態(tài)調用或隱式裝載
使用Windows API函數(shù)LoadLibray和GetProcAddress可以實現(xiàn)在運行時間里動態(tài)裝載DLLs并調用其中的過程。
若程序只在其中的一部分調用DLLs的過程,或者程序使用哪個DLLs, 調用其中的哪個過程需要根據(jù)程序運行的實際狀態(tài)來判斷,那么使用動態(tài)調用就是一個很好的選擇。
使用動態(tài)調用,即使裝載一個DLLs失敗了,程序仍能繼續(xù)運行。
在下面的程序中我們把一個字符串操作的函數(shù)儲存到一個DLLs中,以便需要的時候調用它。應該注意的一點是:為了保證這個函數(shù)可以被其它語言編寫的程序所調用,作為參數(shù)傳遞的字符串應該是無結束符的字符數(shù)組類型(即PChar類型),而不是Object Pascal的帶結束符的Srting類型。程序清單如下:
library Example;
uses
SysUtils,
Classes;
{返回字符在字符串中的位置}
function InStr(SourceStr: PChar;Ch: Char): Integer; export;
var
Len,i: Integer;
begin
Len := strlen(SourceStr);
for i := 0 to Len-1 do
if SourceStr[i] = ch then
begin
Result := i;
Exit;
end;
Result := -1;
end;
exports
Instr Index 1 name 'MyInStr' resident;
begin
end.
10.2.2 調用DLLs
有兩種方法可用于調用一個儲存在DLLs中的過程。
1.靜態(tài)調用或顯示裝載
使用一個外部聲明子句,使DLLs在應用程序開始執(zhí)行前即被裝入。例如:
function Instr(SourceStr : PChar;Check : Char); Integer; far; external 'UseStr';
使用這種方法,程序無法在運行時間里決定DLLs的調用。假如一個特定的DLLs在運行時無法使用,則應用程序將無法執(zhí)行。
2.動態(tài)調用或隱式裝載
使用Windows API函數(shù)LoadLibray和GetProcAddress可以實現(xiàn)在運行時間里動態(tài)裝載DLLs并調用其中的過程。
若程序只在其中的一部分調用DLLs的過程,或者程序使用哪個DLLs, 調用其中的哪個過程需要根據(jù)程序運行的實際狀態(tài)來判斷,那么使用動態(tài)調用就是一個很好的選擇。
使用動態(tài)調用,即使裝載一個DLLs失敗了,程序仍能繼續(xù)運行。