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");
**************************************************************************************************************************
LoadLibrary加載動態庫失敗的解決辦法
方式一 采用LoadLibraryEx
轉載:http://blog.sina.com.cn/s/blog_62ad1b8101017qub.html
若DLL不在調用方的同一目錄下,可以用LoadLibrary(L"DLL絕對路徑")加載。但若調用的DLL內部又調用另外一個DLL,此時調用仍會失敗。解決辦法是用LoadLibraryEx:
LoadLibraryEx("DLL絕對路徑", NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
通過指定LOAD_WITH_ALTERED_SEARCH_PATH,讓系統DLL搜索順序從DLL所在目錄開始。
方式二 采用SetCurrentDir
轉載:http://blog.csdn.net/flyayi2006/article/details/5526982
跨目錄調用dll,你應該這樣
1 用GetCurrentDir保存當前的工作目錄
2 用SetCurrentDir將當前的工作目錄,設置為你的DLL所在的路徑,需要使用絕對路徑
3 用LoadLibrary你的DLL
4 使用SetCurrentDir恢復到原來的工作路徑
實例:
? ? TCHAR chCurDir[MAX_PATH] = {0};? ? GetCurrentDirectory(MAX_PATH, chCurDir);
? ? SetCurrentDirectory(_T("E:\\test\\"));
? ? m_hDLL = LoadLibrary(_T("MyTest.dll"));
? ? SetCurrentDirectory(chCurDir);