10.2.1.6 編寫一般DLLs的應(yīng)用舉例
在下面的程序中我們把一個(gè)字符串操作的函數(shù)儲(chǔ)存到一個(gè)DLLs中,以便需要的時(shí)候調(diào)用它。應(yīng)該注意的一點(diǎn)是:為了保證這個(gè)函數(shù)可以被其它語(yǔ)言編寫的程序所調(diào)用,作為參數(shù)傳遞的字符串應(yīng)該是無(wú)結(jié)束符的字符數(shù)組類型(即PChar類型),而不是Object Pascal的帶結(jié)束符的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 調(diào)用DLLs
有兩種方法可用于調(diào)用一個(gè)儲(chǔ)存在DLLs中的過(guò)程。
1.靜態(tài)調(diào)用或顯示裝載
使用一個(gè)外部聲明子句,使DLLs在應(yīng)用程序開(kāi)始執(zhí)行前即被裝入。例如:
function Instr(SourceStr : PChar;Check : Char); Integer; far; external 'UseStr';
使用這種方法,程序無(wú)法在運(yùn)行時(shí)間里決定DLLs的調(diào)用。假如一個(gè)特定的DLLs在運(yùn)行時(shí)無(wú)法使用,則應(yīng)用程序?qū)o(wú)法執(zhí)行。
2.動(dòng)態(tài)調(diào)用或隱式裝載
使用Windows API函數(shù)LoadLibray和GetProcAddress可以實(shí)現(xiàn)在運(yùn)行時(shí)間里動(dòng)態(tài)裝載DLLs并調(diào)用其中的過(guò)程。
若程序只在其中的一部分調(diào)用DLLs的過(guò)程,或者程序使用哪個(gè)DLLs, 調(diào)用其中的哪個(gè)過(guò)程需要根據(jù)程序運(yùn)行的實(shí)際狀態(tài)來(lái)判斷,那么使用動(dòng)態(tài)調(diào)用就是一個(gè)很好的選擇。
使用動(dòng)態(tài)調(diào)用,即使裝載一個(gè)DLLs失敗了,程序仍能繼續(xù)運(yùn)行。
在下面的程序中我們把一個(gè)字符串操作的函數(shù)儲(chǔ)存到一個(gè)DLLs中,以便需要的時(shí)候調(diào)用它。應(yīng)該注意的一點(diǎn)是:為了保證這個(gè)函數(shù)可以被其它語(yǔ)言編寫的程序所調(diào)用,作為參數(shù)傳遞的字符串應(yīng)該是無(wú)結(jié)束符的字符數(shù)組類型(即PChar類型),而不是Object Pascal的帶結(jié)束符的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 調(diào)用DLLs
有兩種方法可用于調(diào)用一個(gè)儲(chǔ)存在DLLs中的過(guò)程。
1.靜態(tài)調(diào)用或顯示裝載
使用一個(gè)外部聲明子句,使DLLs在應(yīng)用程序開(kāi)始執(zhí)行前即被裝入。例如:
function Instr(SourceStr : PChar;Check : Char); Integer; far; external 'UseStr';
使用這種方法,程序無(wú)法在運(yùn)行時(shí)間里決定DLLs的調(diào)用。假如一個(gè)特定的DLLs在運(yùn)行時(shí)無(wú)法使用,則應(yīng)用程序?qū)o(wú)法執(zhí)行。
2.動(dòng)態(tài)調(diào)用或隱式裝載
使用Windows API函數(shù)LoadLibray和GetProcAddress可以實(shí)現(xiàn)在運(yùn)行時(shí)間里動(dòng)態(tài)裝載DLLs并調(diào)用其中的過(guò)程。
若程序只在其中的一部分調(diào)用DLLs的過(guò)程,或者程序使用哪個(gè)DLLs, 調(diào)用其中的哪個(gè)過(guò)程需要根據(jù)程序運(yùn)行的實(shí)際狀態(tài)來(lái)判斷,那么使用動(dòng)態(tài)調(diào)用就是一個(gè)很好的選擇。
使用動(dòng)態(tài)調(diào)用,即使裝載一個(gè)DLLs失敗了,程序仍能繼續(xù)運(yùn)行。