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

#ifdef BUILD_DLL
#define DLL_EXPORT __declspec(dllexport) __stdcall
#else
#define DLL_EXPORT __declspec(dllimport) __stdcall
#endif int 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(,));
}

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

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

#define WINAPI __stdcall

HMODULE 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(,));
}

最后,我的猜测是,之前代码中没有加入 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

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

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

  1. 在VS2012中采用C++中调用DLL中的函数 (4)

    这两天因为需要用到VS2012来生成一个DLL代码,但是之前并没有用过DLL相关的内容,从昨天开始尝试调试DLL的文件调用,起初笔者在网络上找到了3片采用VSXXX版本进行调试的例子,相关的内容见本人 ...

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

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

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

    应用程序使用DLL可以采用两种方式: 一种是隐式链接,另一种是显式链接.在使用DLL之前首先要知道DLL中函数的结构信息. Visual C++6.0在VC\bin目录下提供了一个名为Dumpbin. ...

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

    如何在C++中调用DLL中的函数 应用程序使用DLL可以采用两种方式:一种是隐式链接,另一种是显式链接.在使用DLL之前首先要知道DLL中函数的结构信息.Visual C++6.0在VC\bin目录下 ...

  5. 【原创】在VS2012中采用C++中调用DLL中的函数(4)

    这两天因为需要用到VS2012来生成一个DLL代码,但是之前并没有用过DLL相关的内容,从昨天开始尝试调试DLL的文件调用,起初笔者在网络上找到了3片采用VSXXX版本进行调试的例子,相关的内容见本人 ...

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

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

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

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

  8. 在VS2012中采用C++中调用DLL中的函数(4)

    转自:http://www.cnblogs.com/woshitianma/p/3683495.html 这两天因为需要用到VS2012来生成一个DLL代码,但是之前并没有用过DLL相关的内容,从昨天 ...

  9. BCB怎么调用DLL中的函数

    推荐你看<BCB编写DLL终极手册>这篇文章如下片段:二. 静态调用 DLL使用 $BCB path\Bin\implib.exe 生成 Lib 文件,加入到工程文件中将该文件拷贝到当前目 ...

随机推荐

  1. WPF 精修篇 WPF嵌入Winfrom控件

    原文:WPF 精修篇 WPF嵌入Winfrom控件 先增加DLL 支持 使用  WindowsFormsHost 来加载Forms的控件 引用命名空间 xmlns:forms="clr-na ...

  2. 我得新博客上线了采用Vue+Layui的结合开发,后台采用asp.net mvc

    地址:www.zswblog.xyz 写完这个博客项目我真的很开心! 希望博客园的大佬们能去看看,如果可以希望帮我在Layui的年度案例点一个赞,谢谢! 地址:https://fly.layui.co ...

  3. 2019 浩德钢圈java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.浩德钢圈等公司offer,岗位是Java后端开发,因为发展原因最终选择去了浩德钢圈,入职一年时间了,也成为了面 ...

  4. 架构师小跟班:推荐46个非常经典的Linux面试题

    大家都知道,做后端开发,做着做着就变成全栈了.一般服务器维护应该是运维的事情,但很多很多公司都是后端工程师在做.所以,基本的Linux系统维护也是后端工程师的必修课.问题一: 绝对路径用什么符号表示? ...

  5. Spring扩展点之Aware接口族

    引言 Spring中提供了各种Aware接口,方便从上下文中获取当前的运行环境,比较常见的几个子接口有:BeanFactoryAware,BeanNameAware,ApplicationContex ...

  6. JS基石之-----数组转换为树结构函数

    我们常常在做后台管理系统的时候 需要对数据进行组装成一个树装结构,这里特地将此方法进行封装: let data = [ { id: , text: }, { id: , text: }, { id: ...

  7. uni-app项目配置记录

    新建项目 直接使用编辑器快速新建,具体方法很简单,官方文档很详细,这里不在叙说 配置项目: 项目搭建好了之后,我们配置一些 api 和 router,这些直接在插件市场上面进行配置,非常好用 封装的r ...

  8. 移动4G插卡注网

    本文根据插入移动4G单卡到注册4G网络过程的mtklog分析. 插卡动作: 从以上信息无法区分单卡还是双卡,通过ATR参数判断: 注网流程,此过程未开启4G数据连接: [MS->NW] ESM_ ...

  9. 普通Java项目中使用Sl4j+Log4j2打印日志

        因工作需要,采用JavaFx开发了一个windows窗口程序.在开发过程中,由于没有引入日志框架,只能自己手动在控制台打印些信息,给调试带来了很多麻烦:因此决定引入日志框架.由于之前接触的项目 ...

  10. mysql 多条数据中,分组获取值最大的数据记录

    摘要: 多条纪录中,几个字段相同,但是其中一个或者多个字段不同,则去该字段最大(这里只有一个不同) 源数据: 目的是移除:在同一天中只能存在一天数据,则取审核日期最大,数据库脚本如下: SELECT ...