在有些情况下需要得到函数调用者的模块名字。比如你想限制你的某个函数只能被自己某个特定的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)
在有些情况下需要得到函数调用者的模块名字。比如你想限制你的某个函数只能被自己某个特定的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)
本文转自 陈本峰 51CTO博客,原文链接:http://blog.51cto.com/wingeek/273935,如需转载请自行联系原作者

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

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

    在有些情况下需要得到函数调用者的模块名字.比如你想限制你的某个函数只能被自己某个特定的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. python几种数据类型的取值方式
  2. [转载] 七龙珠第一部——第057话 小雨对布鲁
  3. Eclipse常用的高效插件
  4. 三种常见中文内码的转换方法
  5. java依赖和约束有啥区别_Java – Maven依赖关系太多了
  6. 【kruskal】【倍增】严格次小生成树(P4180)
  7. Web前端体系的脉络结构
  8. 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: 命名管
  9. 用计算机怎样给文章分解,计算机试卷6分解..pdf
  10. linux路由器实际配置案例
  11. Repeater OnItemCommand 失效
  12. linux ac 命令
  13. Java语言的八大优点
  14. 如何开始Java机器学习
  15. PHP(euc) + Smarty(euc) で、UTF-8やSJIS出力する方法(解決策とまとめ)
  16. “人人皆可成为AI开发者”!百度世界大会官宣百度松果学堂成立
  17. 2017世界GDP排行地图可视化
  18. OpenGL ES 绘制图片
  19. 达梦dsc搭建+dw
  20. 用Nero刻录ISO镜像制作启动光盘

热门文章

  1. 多线程编程(三)--创建线程之Thread VS Runnable
  2. banner轮播无缝滚动 jq代码
  3. hdu 5045 Contest(状态压缩DP)
  4. C# 多线程控制 通讯 和切换
  5. 深入浅出Nintex——更新PeopleandGroup类型的Field
  6. 安卓APP_ 控件(6)—— Notification通知
  7. websocket 发送给前端一个对象_前端WebSocket封装
  8. 疯狂的java 目录_疯狂创客圈 JAVA 高并发 总目录
  9. oracle insert 新增语句
  10. docker查看命令帮助手册