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