GetProcAddress
是不是你認爲它是什麼;它的目的是在DLL中找到命名的過程或函數,並返回該函數的地址,以便從代碼中調用該函數。您必須首先使用LoadLibrary
將動態鏈接庫(DLL)加載到內存中,然後將該句柄傳遞給該DLL,作爲GetProcAddress
的第一個參數以及要將其地址作爲第二個參數的函數的名稱。如果可以在DLL中找到該函數,則返回地址,並且可以使用該地址來調用該函數。
(此外,GetProcAddress
是相當Windows專用的,並且多數在WinAPI的功能stdcall
而不是cdecl
。除非你有文件說,函數使用cdecl
調用約定,你應該使用stdcall
。 )
您的使用條款中至少還需要Windows
單位,因爲這是宣佈GetProcAddress
和LoadLibrary
的地方。
有關更多信息,請參閱關於LoadLibrary和GetProcAddress的WinAPI文檔。
對於一個開始的程序員,你可能會發現使用函數的靜態鏈接而不是動態鏈接(使用GetProcAddress
得到的)更容易。靜態鏈接的一個例子是(未經測試!!! - 只是一個快速的代碼示例,因爲我沒有「HNLib.DLL」來鏈接):
// Your Dll import unit
unit MyDllProcs;
interface
function GetIntCalcResult(const IntVal: Integer);
implementation
function GetIntCalcResult(const IntVal: Integer); stdcall; external 'HNLib.dll';
end.
// Your own app's code
program Test;
interface
uses MyDllProcs;
implementation
function DoSomethingWithDll(const ValueToCalc: Integer): Integer;
begin
Result := GetIntCalcResult(ValueToCalc);
end;
begin
WriteLn('DoSomethingWithDll returned ', DoSomethingWithDll(10));
ReadLn;
end.
注意,當靜態鏈接DLL功能,如這個,你的DLL必須在你的應用程序啓動時可用,並且該函數必須包含在該DLL中;如果沒有,你的應用程序將不會加載。
此外,請注意,您通常不能在DLL中具有多個具有相同名稱的函數,因爲沒有可用的信息來確定加載完成時要加載哪一個函數。每個應該有一個單獨的,不同的名稱或加載可能會失敗。
顯而易見的第一個問題:在您的DLL中是否存在*假設*是一個名爲'GetProcAddress'的函數? – 2012-02-23 23:01:20