[Windows编程] 通过GetModuleHandleEx 得到函数调用者所在的DLL/EXE
2015-04-03 16:25
357 查看
在有些情况下需要得到函数调用者的模块名字。比如你想限制你的某个函数只能被自己某个特定的DLL调用。 或者比如在异常处理中你想了解是那个
DLL/EXE抛出了异常。
收藏失败,转过来的。 原址:/article/1689396.html
API函数_ReturnAddress 和GetModuleHandleEx 函数可以帮助我们达到这个目的。以下代码演示它们的用法:
[cpp] view
plaincopy
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抛出异常。 在程序入口加入
[cpp] view
plaincopy
SetUnhandledExceptionFilter(ShowCallerModuleName);
DLL/EXE抛出了异常。
收藏失败,转过来的。 原址:/article/1689396.html
API函数_ReturnAddress 和GetModuleHandleEx 函数可以帮助我们达到这个目的。以下代码演示它们的用法:
[cpp] view
plaincopy
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抛出异常。 在程序入口加入
[cpp] view
plaincopy
SetUnhandledExceptionFilter(ShowCallerModuleName);
相关文章推荐
- [Windows编程] 通过GetModuleHandleEx 得到函数调用者所在的DLL/EXE
- [Windows编程] 通过GetModuleHandleEx 得到函数调用者所在的DLL/EXE
- 通过GetModuleHandleEx 得到函数调用者所在的DLL/EXE(转)
- 通过GetModuleHandleEx 得到函数调用者所在的DLL/EXE
- 通过GetModuleHandleEx 得到函数调用者所在的DLL/EXE
- GetModuleFileName函数当前运行exe或dll的路径
- 通过CHtmlView::GetHtmlDocument函数得到HTML源文件
- Windows平台下GCC编程之根据以下公式计算s,计算结果作为函数值返回;n通过形参传入。 s=1+1/3+1/5+···+1/(2n-1)
- VC新建目录CreateDirectory、得到exe存放路径GetModuleFileName、获取当前目录GetCurrentDirectory、CFileDialog设置打开默认路径
- windows下socket编程GetLastError()函数返回结果与对照表-转
- GetModuleFileName函数得到当前应用程序路径
- AFX_MANAGE_STATE(AfxGetStaticModuleState())DLL导出函数包含MFC资源
- 通过GetProcAddress函数动态调用dll中地函数,是否必须通过extern C声明导出函数?
- 通过 GetFileVersionInfo 获取EXE 或 DLL的各种资源 .
- 通过GetProcAddress函数动态调用dll中地函数,是否必须通过extern C声明导出函数?(转)
- 使用GetModuleFileName函数获取当前程序所在目录
- 使用GetModuleFileName()获取当前.exe所在绝对路径,并且读取.ini配置文件
- windows下socket编程GetLastError()函数返回结果与对照表
- Windows核心编程学习四:GetModuleHandle获取进程的地址空间中的可执行文件的基地址
- Sessions, Window Stations and Desktops(GetDesktopWindow函数得到的桌面句柄, 是Csrss.exe创建的一个窗口)