Posted on 2008-07-24 20:43
RichardHe 閱讀(1023)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
[再轉(zhuǎn)]
函數(shù)功能描述:GetProcAddress函數(shù)檢索指定的動(dòng)態(tài)鏈接庫(kù)(DLL)中的輸出庫(kù)函數(shù)地址。
函數(shù)原型:
FARPROC GetProcAddress(
HMODULE hModule, // DLL模塊句柄
LPCSTR lpProcName // 函數(shù)名
);
參數(shù):
hModule
[in] 包含此函數(shù)的DLL模塊的句柄。LoadLibrary或者GetModuleHandle函數(shù)可以返回此句柄。
lpProcName
[in] 包含函數(shù)名的以NULL結(jié)尾的字符串,或者指定函數(shù)的序數(shù)值。如果此參數(shù)是一個(gè)序數(shù)值,它必須在一個(gè)字的底字節(jié),高字節(jié)必須為0。
返回值:
如果函數(shù)調(diào)用成功,返回值是DLL中的輸出函數(shù)地址。
如果函數(shù)調(diào)用失敗,返回值是NULL。得到進(jìn)一步的錯(cuò)誤信息,調(diào)用函數(shù)GetLastError。
注釋:
GetProcAddress函數(shù)被用來(lái)檢索在DLL中的輸出函數(shù)地址。
lpProcName指針指向的函數(shù)名,拼寫和大小寫必須和DLL源代碼中的模塊定義文件(.DEF)中輸出段(EXPORTS)中指定的相同。
Win32
API函數(shù)的輸出名可能不同于你在代碼中調(diào)用的這些函數(shù)名,這個(gè)不同被宏隱含在相關(guān)的SDK頭文件中。如果想得到更多信息,請(qǐng)參考Win32函數(shù)原型
(Win32 Function Prototypes)。
lpProcName參數(shù)能夠識(shí)別DLL中的函數(shù),通過(guò)指定一個(gè)與函數(shù)相聯(lián)系的序數(shù)值(在.DEF中的EXPORTS段)。GetProcAddress
函數(shù)驗(yàn)證那個(gè)指定的序數(shù)值是否在輸出的序數(shù)1和最高序數(shù)值之間(在.DEF中)。函數(shù)用這個(gè)序數(shù)值作為索引從函數(shù)表中讀函數(shù)地址,假如.DEF
文件不連續(xù)地定義函數(shù)的序數(shù)值,如從1到N(N是輸出的函數(shù)序數(shù)值),錯(cuò)誤將會(huì)發(fā)生,GetProcAddress將會(huì)返回一個(gè)錯(cuò)誤的、非空的地址,雖然
指定的序數(shù)沒(méi)有對(duì)應(yīng)的函數(shù)。
為了防止函數(shù)不存在,函數(shù)應(yīng)該通過(guò)名字指定而不是序數(shù)值。
要求:
Windows NT/2000: 要求Windows NT 3.1 或以后版本。
Windows 95/98: 要求Windows 95 或以后版本。
頭文件: 在Winbase.h中聲明,include Windows.h。
庫(kù)文件: Use Kernel32.lib。
參看:
動(dòng)態(tài)鏈接庫(kù)縱覽(Dynamic-Link Libraries Overview), 動(dòng)態(tài)鏈接庫(kù)函數(shù)(Dynamic-Link Library Functions),FreeLibrary, GetModuleHandle, LoadLibrary
示例代碼:
調(diào)用KERNEL32.DLL中的RegisterServiceProcess(僅在Windows98中適用)
HMODULE hModule=GetModuleHandle("kernel32.dll");
if (hModule)
{
typedef DWORD (CALLBACK *LPFNREGISTER)(DWORD,DWORD);
LPFNREGISTER lpfnRegister;
lpfnRegister=(LPFNREGISTER)GetProcAddress(hModule,"RegisterServiceProcess");
if (lpfnRegister)
{
(*lpfnRegister)(NULL,1L);
}
}