GetProcAddress() LoadLibrary() DLL
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ù)是一個序數(shù)值,它必須在一個字的底字節(jié),高字節(jié)必須為0。
返回值:
如果函數(shù)調(diào)用成功,返回值是DLL中的輸出函數(shù)地址。
如果函數(shù)調(diào)用失敗,返回值是NULL。得到進一步的錯誤信息,調(diào)用函數(shù)GetLastError。
?
FARPROC 是一個4字節(jié)指針,指向一個函數(shù)的內(nèi)存地址,例如
GetProcAddress 的返回類型就是一個FARPROC。
如果你要存放這個地址,可以聲明以一個 FARPROC變量來存放。
?
GetProcAddress返回的是一個函數(shù)地址的指針。
聲明:FARPROC WINAPI GetProcAddress(__in HMODULE hModule, __in LPCSTR LpProcName);
你應(yīng)該知道你要的函數(shù)的類型是什么,可以用typedef的方法定義函數(shù)類型,然后定義一個這種類型的變量,你得到地址后,將地址的類型轉(zhuǎn)換并存到那個變量中就行了。例如:
?這是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加載動態(tài)庫失敗的解決辦法
方式一 采用LoadLibraryEx
轉(zhuǎn)載:http://blog.sina.com.cn/s/blog_62ad1b8101017qub.html
若DLL不在調(diào)用方的同一目錄下,可以用LoadLibrary(L"DLL絕對路徑")加載。但若調(diào)用的DLL內(nèi)部又調(diào)用另外一個DLL,此時調(diào)用仍會失敗。解決辦法是用LoadLibraryEx:
LoadLibraryEx("DLL絕對路徑", NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
通過指定LOAD_WITH_ALTERED_SEARCH_PATH,讓系統(tǒng)DLL搜索順序從DLL所在目錄開始。
方式二 采用SetCurrentDir
轉(zhuǎn)載:http://blog.csdn.net/flyayi2006/article/details/5526982
跨目錄調(diào)用dll,你應(yīng)該這樣
1 用GetCurrentDir保存當(dāng)前的工作目錄
2 用SetCurrentDir將當(dāng)前的工作目錄,設(shè)置為你的DLL所在的路徑,需要使用絕對路徑
3 用LoadLibrary你的DLL
4 使用SetCurrentDir恢復(fù)到原來的工作路徑
實例:
? ? TCHAR chCurDir[MAX_PATH] = {0};? ? GetCurrentDirectory(MAX_PATH, chCurDir);
? ? SetCurrentDirectory(_T("E:\\test\\"));
? ? m_hDLL = LoadLibrary(_T("MyTest.dll"));
? ? SetCurrentDirectory(chCurDir);
總結(jié)
以上是生活随笔為你收集整理的GetProcAddress() LoadLibrary() DLL的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装包官方下载链接
- 下一篇: 魔兽国服修改服务器地址,魔兽国服退役服务