[Windows编程] 通过GetModuleHandleEx 得到函数调用者所在的DLL/EXE 原创陈本峰2009-02
生活随笔
收集整理的這篇文章主要介紹了
[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,如需轉載請自行聯系原作者
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ie浏览器跨域报错问题;Access-C
- 下一篇: [ECMAScript] es6对函数做