您的位置:首页 > 编程语言

[Windows编程] 通过GetModuleHandleEx 得到函数调用者所在的DLL/EXE

2015-04-03 16:25 357 查看
在有些情况下需要得到函数调用者的模块名字。比如你想限制你的某个函数只能被自己某个特定的DLL调用。 或者比如在异常处理中你想了解是那个
DLL/EXE抛出了异常。
收藏失败,转过来的。 原址:/article/1689396.html
API函数_ReturnAddressGetModuleHandleEx 函数可以帮助我们达到这个目的。以下代码演示它们的用法:

[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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐