在有些情況下需要得到函數調用者的模塊名字。比如你想限制你的某個函數只能被自己某個特定的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);
?}
}
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)
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);
?}
}
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)
SetUnhandledExceptionFilter(ShowCallerModuleName)
本文轉自 陳本峰 51CTO博客,原文鏈接:http://blog.51cto.com/wingeek/273935,如需轉載請自行聯系原作者