在有些情况下需要得到函数调用者的模块名字。比如你想限制你的某个函数只能被自己某个特定的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); 

 

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

  1. [Windows编程] 通过GetModuleHandleEx 得到函数调用者所在的DLL/EXE 原创陈本峰2009-02

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

  2. windows编程常用系统API函数

    windows编程常用API的函数 1. API之网络函数 2. API之消息函数 3. API之文件处理函数 4. API之打印函数 5. API之文本和字体函数 6. API之菜单函数 7. AP ...

  3. Windows编程之使用GetAsyncKeyState()函数为什么要( 0x8000)?

    Windows编程之使用GetAsyncKeyState()函数为什么要(& 0x8000)? 先来看看GetAsyncKeyState()函数的原型:  SHORT GetAsyncKeyS ...

  4. Windows编程之--桌面壁纸实现深入探索

    本文原创,最早发表于公司内部博客, 禁止转载 文章目录 一. 前言 二. Windows桌面壁纸原理 1. 桌面窗口层次 2. 桌面嵌入窗口实现壁纸 2.1. Desktop Window Manag ...

  5. Windows 编程

    Delphi 利用Object Pascal 和可视控件库(VCL)对底层的Windows API 进行了完美的封装,所以很少需要使用基础Pascal 语言来建立Windows应用程序,也无需直接调用 ...

  6. 【Windows编程】windows窗口创建过程详解

    文章目录 前言 1 应用程序的分类 2 应用程序分类的对比 3 编译工具 4 windows库文件和头文件 5 WinMain函数和MessageBox函数初始 6 窗口类 7 窗口类的分类 8 注册 ...

  7. 浅谈windows 编程中SendMessage函数的妙用!!!

    windows编程中SendMessage函数是非常重要的,而且这个对于理解windows的消息机制也很重要.本文用代码的方式实现了一些功能,借以说明此函数之妙用.说明不当之处,希望批评指正,谢谢! ...

  8. Qt:Windows编程—代码注入

    前言 ​ 这里所说的代码注入和上篇的DLL注入有类似之处.DLL文件的注入与卸载在上篇中都完成了,整个注入与卸载的过程其实就是让远程线程执行一次LoadLibrary函数或者FreeLibrary函数 ...

  9. Windows编程—Windows驱动中定时器的使用

    文章目录 Windows编程-Windows驱动中定时器的使用 前言 代码 简单版 升级版 程序效果 Windows编程-Windows驱动中定时器的使用 前言 定时器操作是应用编程中非常常见的操作, ...

最新文章

  1. 《小程序个人信息保护研究报告》解读
  2. Mac OSX 10.9下apache+php+mysql的配置
  3. 如何不屏蔽Android系统的返回按键
  4. VTK:绘图之BarChart
  5. 18 Context与组合的应用场景与使用问题
  6. 搭建前端监控系统(四)接口请求异常监控篇
  7. Python入门--with语句
  8. 微软未来五年将把80%资源投入云计算
  9. ubuntu 14.04 install teamviewer
  10. VirtualBox开启USB的方法
  11. 【人在运维囧途_08】淘宝内部大量使用的开源系统监控工具--Tsar
  12. 使用电信光猫加路由器实现内网穿透,外网访问内网
  13. 【零散知识】核密度估计(Kernel Density Estimation)
  14. 百度搜索结果页面的参数 提示词输入搜索框方式(rsv_sug5)
  15. 杜比、DTS、PCM、A-C3、THX、SDDS音效介绍(转贴)
  16. tf.variable_scope,reuse复用变量
  17. 测试用例(功能用例)——登录、首页、个人信息
  18. matlab——求矩阵最大特征值对应的特征向量
  19. 如何用最低的成本成就最高流量系列 各种线上推广手段的投入产出比数字公布(IreSearch.cn/龚文祥)(推荐帖)
  20. 使用cmd命令创建vue2脚手架

热门文章

  1. 打印二叉树和为某一值的路径
  2. android Java BASE64编码和解码一:基础
  3. fancybox 在打开窗口前 先执行 js脚本,fancybox设置只能通过右上角关闭,fancybox遮罩层关闭...
  4. django-2 模板文件的加载
  5. 《互联网运营智慧》之自序(新)
  6. 华为网络技术培训笔记之常用网络工具(二)
  7. NAC网络访问控制,你需要知道的!
  8. Android 关于获取摄像头帧数据解码
  9. PostgreSQL 编译安装
  10. Java报表工具技巧--如何在Style Report创建用户自定义报表模板