在一个名为 test.dll 文件中,有一个 Max() 函数的定义是:

#ifdef BUILD_DLL
#define DLL_EXPORT __declspec(dllexport) __stdcall
#else
#define DLL_EXPORT __declspec(dllimport) __stdcall
#endifint DLL_EXPORT Max(int x, int y);

当我在c程序中,定了一个函数指针类型为: int (*func)(int, int) 时

HMODULE h = LoadLibrary("test.dll");
if(h)
{int (*func)(int, int)  =(int (*)(int, int))GetProcAddress(h, "Max");printf("max(1,2):%d\n", func(1,2));
}

调用这个函数 func(1,2) 后, windows 并不会马上报错,当程序退出时 windows 会报错:

如果函数指针在定义的时候,加上 WINAPI ,就不会有问题:

#define WINAPI __stdcallHMODULE h = LoadLibrary("test.dll");
if(h)
{int (WINAPI *func)(int, int)  =(int (WINAPI *)(int, int))GetProcAddress(h, "Max");printf("max(1,2):%d\n", func(1,2));
}

最后,我的猜测是,之前代码中没有加入 WINAPI 在程序退出后, windows 会报错的原因,应该与 dll 中的 __stdcall 有关。

应该是涉及到 栈(STACK)的清除 问题。

相关资料:

_cdecl 和_stdcall:https://www.cnblogs.com/52yixin/archive/2011/06/29/2093634.html

_stdcall 与 _cdecl:https://blog.csdn.net/nightwizard2030/article/details/86596635

_stdcall与_cdecl区别:https://blog.csdn.net/leehong2005/article/details/8607536

名品推荐:花房 伊箬萱 千年马 贝妍

转载于:https://www.cnblogs.com/personnel/p/11314639.html

调用 Dll 中的函数时,出现栈(STACK)的清除问题 - 故障模块名称: StackHash_0a9e相关推荐

  1. C#调用dll中的函数

    C#调用dll中的函数 文章分类:操作系统 文章来源:http://blog.csdn.net/strmagic/archive/2007/11/02/1863462.aspx 大家在实际工作学习C# ...

  2. 天马行空W:在C++中调用DLL中的函数

    1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等 ...

  3. 在C++中调用DLL中的函数

    1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等 ...

  4. 在C++中调用DLL中的函数(2)

    本文转自:http://blog.sina.com.cn/s/blog_53004b4901009h3b.html 应用程序使用DLL可以采用两种方式: 一种是隐式链接,另一种是显式链接.在使用DLL ...

  5. 通过GetProcAddress函数动态调用dll中地函数,是否必须通过extern C声明导出函数?(转)...

    通过GetProcAddress函数动态调用dll中的函数,是否必须通过extern "C"声明导出函数? [已结贴,结贴人:darongtou] 如题,网上搜了N多资料,一直找不 ...

  6. 如何调用 DLL 中的函数

     如何调用 DLL 中的函数 在 DLL工程中的 cpp中函数定义如下: extern "C" _declspec (dllexport ) int add(int a, ch ...

  7. GetProcAddress()函数动态调用DLL中的函数,是否必须通过extern C声明导出函数?

    GetProcAddress()函数动态调用DLL中的函数,是否必须通过extern C声明导出函数? 通过GetProcAddress函数动态调用dll中的函数,是否必须通过extern " ...

  8. 如何调用DLL中的函数

    如何调用 DLL 中的函数 在 DLL工程中的 cpp中函数定义如下: extern "C" _declspec (dllexport ) int add(int a, char ...

  9. 从零开始使用InnoSteup进行程序打打包以及调用dll中的函数

    本示例涉及: 程序的打包和数字签名 InnoSetup的快速上手 以及一个产品从编译到安装的过程演示 首先,我提供一份InnoSteup的脚本文件,小伙伴们可直接使用这个脚本进行打包(不过得修改一下相 ...

最新文章

  1. 腾讯郭振宇:腾讯云发布云IoT全栈产品矩阵,详解6大产品及3大案例
  2. 通过机器学习识别“迪士尼在逃公主”,程序员宠女的正确打开方式!
  3. php怎么循环输出二维数组,PHP中遍历二维数组—以不同形式的输出操作
  4. 技术人员兼职招聘平台HourlyHerd融资2200万美元C轮融资
  5. 【英语学习】【Level 07】U04 Rest and Relaxation L1 Waiting to board a train
  6. 3299元起!结缘梅奔F1车队,Redmi K50电竞版发布
  7. Pycrypto与RSA密码技术
  8. 【Tomcat】Tomcat下设置项目为默认项目
  9. 工作流牛人 Jan Mendling
  10. 投资捕鱼游戏市场的如何避雷?以及研发技术问题。
  11. PDF文件怎么转换成Word文档
  12. zotero+坚果云
  13. PlantCV中文文档
  14. jpa 清空数据库的写法
  15. Python骚操作—自动刷抖音
  16. 查看计算机ip地址配置信息的命令是,查看电脑配置指令大全
  17. (最简单)Java 格式化数字每3位加逗号分隔(自己封装好的工具类,直接可用)
  18. 群晖服务器216j增加硬盘,群晖NAS提速大法:解决机械硬盘频繁同时读写的问题,有效提升硬盘寿命...
  19. 关于多极充磁磁环表面磁场分布的研发历程GM900系列表磁分布测量仪
  20. 英语思维导图大全 虚拟语气(十三)

热门文章

  1. SpringBoot和Vue集成Markdown和多级评论——基于SpringBoot和Vue的后台管理系统项目系列博客(二十三)
  2. linux终端快捷指令打开pycharm
  3. java狼追着羊跑的程序_Java编程能力强化——狼羊过河问题
  4. 绿叶制药与华昊中天就抗肿瘤创新药优替帝达成合作;邦耀生物与易迪希达成合作 | 医药健闻...
  5. Boostnote 笔记搭配 WordPress 博客系统发布博客
  6. Pandas数据分析⑥——数据分析实例(货品送达率与合格率/返修率/拒收率)
  7. msm 8953 制作算法分区的部分记录,太容易忘记了
  8. ios开发 方形到圆的动画_iOS利用UIBezierPath + CAAnimation实现路径动画效果
  9. centos7 搭建harbor2.0
  10. 小小的屏蔽罩,大大的门道!