Windows API GetProcAddress 及demo code
GetProcAddress函數(shù)檢索指定的動態(tài)鏈接庫(DLL)中的輸出庫函數(shù)地址。
函數(shù)原型:
FARPROC GetProcAddress(
HMODULE hModule, // DLL模塊句柄
LPCSTR lpProcName// 函數(shù)名
);
參數(shù):
hModule
[in] 包含此函數(shù)的DLL模塊的句柄。LoadLibrary、AfxLoadLibrary?或者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。
?
FARPROC 是一個(gè)4字節(jié)指針,指向一個(gè)函數(shù)的內(nèi)存地址,例如
GetProcAddress 的返回類型就是一個(gè)FARPROC。
如果你要存放這個(gè)地址,可以聲明以一個(gè) FARPROC變量來存放。
?
GetProcAddress返回的是一個(gè)函數(shù)地址的指針。
聲明:FARPROC WINAPI GetProcAddress(__in HMODULE hModule, __in LPCSTR LpProcName);
你應(yīng)該知道你要的函數(shù)的類型是什么,可以用typedef的方法定義函數(shù)類型,然后定義一個(gè)這種類型的變量,你得到地址后,將地址的類型轉(zhuǎn)換并存到那個(gè)變量中就行了。例如:
?這是RunHook定義:
BOOL _stdcall RunHook(HMODULE hModule,DWORD dwThreadId)
{
HWndHook=::SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)HOOKProc,hMod,dwThreadId);
return TRUE;
}
這是全局聲明:
typedef BOOL (_stdcall *funRunHook)(HMODULE hModule,DWORD dwThreadID);
這兩種調(diào)用都不行:
funRunHook RunHook;
RunHook=(funRunHook)GetProcAddress(hMod,"RunHook");
LoadLibrary
Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
說明
載入指定的動態(tài)鏈接庫,并將它映射到當(dāng)前進(jìn)程使用的地址空間。一旦載入,即可訪問庫內(nèi)保存的資源返回值
Long,成功則返回庫模塊的句柄,零表示失敗。會設(shè)置GetLastError 參數(shù) 類型及說明 lpLibFileName String,指定要載入的動態(tài)鏈接庫的名稱。采用與CreateProcess函數(shù)的lpCommandLine參數(shù)指定的同樣的搜索順序 注解 一旦不需要,用FreeLibrary函數(shù)釋放DLL**********************************************************************************************************************************************************
原文:http://blog.csdn.net/g5dsk/article/details/6680698
使用?GetProcAddress?Function?時(shí),有以下幾點(diǎn)需要特別留意:
1. 第二個(gè)參數(shù)類型是?LPCSTR,不是?LPCTSTR;
2. 用?__declspec(dllexport),按?C?名稱修飾(extern "C") 導(dǎo)出的函數(shù)名,對于?__stdcall?和?__fastcall?調(diào)用約定是相同的;對?__cdecl?是不同的(導(dǎo)出的函數(shù)名沒有前面的下劃線);
3. 即使返回值不是?NULL,也有可能發(fā)生錯(cuò)誤。當(dāng) .def 模塊不是連續(xù)地從 1 開始編號 ordinal 值,那么,如果用一個(gè)無函數(shù)對應(yīng)的 ordinal 值調(diào)用?GetProcAddress,就會發(fā)生錯(cuò)誤,返回一個(gè)無效的非?NULL?地址;?
4. 最好用函數(shù)名,而不是 ordinal 值調(diào)用?GetProcAddress,以避免不同版本 Dll 中某些函數(shù)不存在的情況。
注:確認(rèn) Dll 的導(dǎo)出函數(shù)名,可以用?DUMPBIN /EXPORTS dll_file_name.dll?命令,然后查看?name?列。
[cpp]?view plain?copy ?print?
總結(jié)
以上是生活随笔為你收集整理的Windows API GetProcAddress 及demo code的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 兄弟,学点AI吗?2知识的确定性系统
- 下一篇: 工业机器人电路图讲解话术_智能对话机器人