日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

GetProcAddress() LoadLibrary() DLL

發(fā)布時間:2023/12/20 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GetProcAddress() LoadLibrary() DLL 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。