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的方法定義函數類型,然后定義一個這種類型的變量,你得到地址后,將地址的類型轉換并存到那個變量中就行了。例如:
?
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");
說明
返回值
**********************************************************************************************************************************************************
原文: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?列。
- //?The?myPuts?function?writes?a?null-terminated?string?to??
- //?the?standard?output?device.??
- ???
- //?The?export?mechanism?used?here?is?the?__declspec(export)??
- //?method?supported?by?Microsoft?Visual?Studio,?but?any??
- //?other?export?method?supported?by?your?development??
- //?environment?may?be?substituted.??
- ???
- ???
- #include?<windows.h>??
- ???
- #define?EOF?(-1)??
- ???
- #ifdef?__cplusplus????//?If?used?by?C++?code,???
- extern?"C"?{??????????//?we?need?to?export?the?C?interface??
- #endif??
- ???
- __declspec(dllexport)?int?__cdecl?myPuts(LPTSTR?lpszMsg)?//?__cdecl?|?__stdcall?|?__fastcall??
- {??
- ????DWORD?cchWritten;??
- ????HANDLE?hStdout;??
- ????BOOL?fRet;??
- ???
- ????//?Get?a?handle?to?the?standard?output?device.??
- ???
- ????hStdout?=?GetStdHandle(STD_OUTPUT_HANDLE);??
- ????if?(INVALID_HANDLE_VALUE?==?hStdout)??
- ????????return?EOF;??
- ???
- ????//?Write?a?null-terminated?string?to?the?standard?output?device.??
- ???
- ????while?(*lpszMsg?!=?'\0')??
- ????{??
- ????????fRet?=?WriteFile(hStdout,?lpszMsg,?1,?&cchWritten,?NULL);??
- ????????if(?(FALSE?==?fRet)?||?(1?!=?cchWritten)?)??
- ????????????return?EOF;??
- ????????lpszMsg++;??
- ????}??
- ???
- ????return?1;??
- }??
- ???
- #ifdef?__cplusplus??
- }??
- #endif??
- //?A?simple?program?that?uses?LoadLibrary?and???
- //?GetProcAddress?to?access?myPuts?from?Myputs.dll.???
- ???
- #include?<stdio.h>???
- #include?<windows.h>???
- ???
- typedef?int?(__cdecl?*MYPROC)(LPTSTR);?//?__cdecl?|?__stdcall?|?__fastcall??
- ???
- VOID?main(VOID)???
- {???
- ????HINSTANCE?hinstLib;???
- ????MYPROC?ProcAdd;???
- ????BOOL?fFreeResult,?fRunTimeLinkSuccess?=?FALSE;???
- ???
- ????//?Get?a?handle?to?the?DLL?module.??
- ???
- ????hinstLib?=?LoadLibrary(TEXT("bin\\Myputs"));?//?雖然?MSDN?Library?說這里如果??
- ?????????????????????????????????????????????????//?指定了路徑,要用?backslashes?(\),??
- ?????????????????????????????????????????????????//?不要用?forward?slashes?(/),但??
- ?????????????????????????????????????????????????//?其實用二者都可以。??
- ?????????????????????????????????????????????????//?注:如果用?\,要用?\\。??
- ???
- ????//?If?the?handle?is?valid,?try?to?get?the?function?address.??
- ???
- ????if?(hinstLib?!=?NULL)???
- ????{???
- ????????ProcAdd?=?(MYPROC)GetProcAddress(hinstLib,?"myPuts");?//?__cdecl???:?myPuts??
- ??????????????????????????????????????????????????????????????//?__stdcall?:?_myPuts@4??
- ??????????????????????????????????????????????????????????????//?__fastcall:?@myPuts@4??
- ???
- ????????//?If?the?function?address?is?valid,?call?the?function.??
- ???
- ????????if?(NULL?!=?ProcAdd)???
- ????????{??
- ????????????fRunTimeLinkSuccess?=?TRUE;??
- ????????????(ProcAdd)?(TEXT("Message?via?DLL?function\n"));???
- ????????}??
- ???
- ????????//?Free?the?DLL?module.??
- ???
- ????????fFreeResult?=?FreeLibrary(hinstLib);???
- ????}???
- ???
- ????//?If?unable?to?call?the?DLL?function,?use?an?alternative.??
- ???
- ????if?(!?fRunTimeLinkSuccess)???
- ????????printf("Message?via?alternative?method\n");???
- } ?