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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

[Windows编程] 通过GetModuleHandleEx 得到函数调用者所在的DLL/EXE 原创陈本峰2009-02

發布時間:2023/12/9 windows 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Windows编程] 通过GetModuleHandleEx 得到函数调用者所在的DLL/EXE 原创陈本峰2009-02 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在有些情況下需要得到函數調用者的模塊名字。比如你想限制你的某個函數只能被自己某個特定的DLL調用。 或者比如在異常處理中你想了解是那個DLL/EXE拋出了異常。 API函數_ReturnAddress 和GetModuleHandleEx 函數可以幫助我們達到這個目的。以下代碼演示它們的用法: view plaincopy to clipboardprint?
void ShowCallerModuleName()???
{???
??? HMODULE hCallerModule = NULL;???
??? TCHAR szModuleName[MAX_PATH] = _T("");???
??? void *callerAddress = _ReturnAddress();???
??? if (GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCTSTR)callerAddress, &hCallerModule))???
??? {???
??????? GetModuleFileName(hCallerModule, szModuleName, ARRAYSIZE(szModuleName));???
??????? MessageBox(NULL, szModuleName, _T("Who is calling me?"), MB_OK);???
??? }???
}??
void ShowCallerModuleName()
{
?HMODULE hCallerModule = NULL;
??? TCHAR szModuleName[MAX_PATH] = _T("");
?void *callerAddress = _ReturnAddress();
??? if (GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCTSTR)callerAddress, &hCallerModule))
?{
??GetModuleFileName(hCallerModule, szModuleName, ARRAYSIZE(szModuleName));
??MessageBox(NULL, szModuleName, _T("Who is calling me?"), MB_OK);
?}
} 解釋: _ReturnAddress 可以給你所在函數的返回地址,也就是調用者的地址。 GetModuleHandleEx 可以給你某個地址所在的模塊Handle 。 得到這個Handle 之后,就可以用GetModuleFileName 來得到模塊的文件名了。 如上面提到的,我們可以用這個方法來捕捉是哪個DLL/EXE拋出異常。 在程序入口加入 view plaincopy to clipboardprint?
SetUnhandledExceptionFilter(ShowCallerModuleName)

在有些情況下需要得到函數調用者的模塊名字。比如你想限制你的某個函數只能被自己某個特定的DLL調用。 或者比如在異常處理中你想了解是那個DLL/EXE拋出了異常。 API函數_ReturnAddress 和GetModuleHandleEx 函數可以幫助我們達到這個目的。以下代碼演示它們的用法: view plaincopy to clipboardprint?
void ShowCallerModuleName()???
{???
??? HMODULE hCallerModule = NULL;???
??? TCHAR szModuleName[MAX_PATH] = _T("");???
??? void *callerAddress = _ReturnAddress();???
??? if (GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCTSTR)callerAddress, &hCallerModule))???
??? {???
??????? GetModuleFileName(hCallerModule, szModuleName, ARRAYSIZE(szModuleName));???
??????? MessageBox(NULL, szModuleName, _T("Who is calling me?"), MB_OK);???
??? }???
}??
void ShowCallerModuleName()
{
?HMODULE hCallerModule = NULL;
??? TCHAR szModuleName[MAX_PATH] = _T("");
?void *callerAddress = _ReturnAddress();
??? if (GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCTSTR)callerAddress, &hCallerModule))
?{
??GetModuleFileName(hCallerModule, szModuleName, ARRAYSIZE(szModuleName));
??MessageBox(NULL, szModuleName, _T("Who is calling me?"), MB_OK);
?}
} 解釋: _ReturnAddress 可以給你所在函數的返回地址,也就是調用者的地址。 GetModuleHandleEx 可以給你某個地址所在的模塊Handle 。 得到這個Handle 之后,就可以用GetModuleFileName 來得到模塊的文件名了。 如上面提到的,我們可以用這個方法來捕捉是哪個DLL/EXE拋出異常。 在程序入口加入 view plaincopy to clipboardprint?
SetUnhandledExceptionFilter(ShowCallerModuleName)



本文轉自 陳本峰 51CTO博客,原文鏈接:http://blog.51cto.com/wingeek/273935,如需轉載請自行聯系原作者

總結

以上是生活随笔為你收集整理的[Windows编程] 通过GetModuleHandleEx 得到函数调用者所在的DLL/EXE 原创陈本峰2009-02的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。