通过GetModuleHandleEx 得到函数调用者所在的DLL/EXE

news/2024/7/10 5:43:13 标签: null, module, path, dll, api

 转自http://blog.csdn.net/WinGeek/archive/2009/02/10/3872526.aspx

 

     在有些情况下需要得到函数调用者的模块名字。比如你想限制你的某个函数只能被自己某个特定的DLL调用。 或者比如在异常处理中你想了解是那个DLL/EXE抛出了异常。

 

API函数_ReturnAddressGetModuleHandleEx 函数可以帮助我们达到这个目的。以下代码演示它们的用法:

 

 

view plain copy to clipboard print ?
  1. void ShowCallerModuleName()   
  2. {   
  3.     HMODULE hCallerModule = NULL;   
  4.     TCHAR szModuleName[MAX_PATH] = _T("");   
  5.     void *callerAddress = _ReturnAddress();   
  6.     if (GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCTSTR)callerAddress, &hCallerModule))   
  7.     {   
  8.         GetModuleFileName(hCallerModule, szModuleName, ARRAYSIZE(szModuleName));   
  9.         MessageBox(NULL, szModuleName, _T("Who is calling me?"), MB_OK);   
  10.     }   
  11. }  

 

 

解释:

_ReturnAddress 可以给你所在函数的返回地址,也就是调用者的地址。

GetModuleHandleEx 可以给你某个地址所在的模块Handle 。 得到这个Handle 之后,就可以用GetModuleFileName 来得到模块的文件名了。

 

如上面提到的,我们可以用这个方法来捕捉是哪个DLL/EXE抛出异常。 在程序入口加入

 

 

view plain copy to clipboard print ?
  1. SetUnhandledExceptionFilter(ShowCallerModuleName);  

 

 

 


http://www.niftyadmin.cn/n/1536384.html

相关文章

[转帖]终于明白为什么要“分库分表”了!

终于明白为什么要“分库分表”了! 随着互联网产业的蓬勃发展,在互联网应用上产生的数据也是与日俱增。产生大量的交易记录和行为记录,它们的存放和分析是我们需要面对的问题。 作者:崔皓来源:51CTO技术栈|2019-09-09 0…

【知识必备】ezSQL,最好用的数据库操作类,让php操作sql更简单~

最近用php做了点小东东,用上了ezSQL,感觉真的很ez,所以拿来跟大家分享一下~ ezSQL是一个非常好用的PHP数据库操作类。著名的开源博客WordPress的数据库操作就使用了ezSQL的MySQL部分。该数据库操作类支持几乎所有主流的数据库,如&…

堆和栈的区别在哪里?

堆和栈的区别在哪里? 哪些变量会在栈中分配空间,哪些变量会在堆中分配空间? --------------------------------------------------------------- 1、申请方式 stack: 由系统自动分配。 例如…

[转帖]持久化journalctl日志清空命令查看配置参数详解

持久化journalctl日志清空命令查看配置参数详解 最近 linux上面部署服务 习惯使用systemd 进行处理 这样最大的好处能够 使用journalctl 进行查看日志信息. 今天清理了下 日志 用的是 cd /run/log/journal 删除掉里面的文件来执行的其实还可以执行持久化的操作 就是这个博客将…

转 苹果企业级帐号进行ipa打包,分发,下载等流程

1,企业帐号介绍(1)使用企业开发帐号,我们可以发布一个 ipa 放到网上,所有人(包括越狱及非越狱设备)都可以直接通过链接下载安装,而不需要通过 AppStore 下载,也不需要安装…

C++堆与栈的区别

一个由c/C编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放&a…

OpenAL

http://blog.csdn.net/luckilyyu/article/details/6894707转载于:https://www.cnblogs.com/dongerlei/p/6136369.html

H.323和SIP通信协议

H.323和SIP分别是通信领域与因特网领域推出的协议。这两个协议都包含关于语音编码和解压缩方面的要求,都对IP网络电话系统(VoIP)信令提出了完整的解决方案,它们对呼叫的连接都有建立、管理和释放的能力,都具有网络管理…