在一个名为 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. SharpImage图像特效和合成类库介绍

    SharpImage是用于.NET(C#.VB)的专业图像特效以及图像合成类库.借助它,您可以快速实现Photoshop滤镜效果以及图层合成. 1.内置50+种图像特效滤镜.(如亮度.对比度.负片.图 ...

  2. 通过Maven发部项目的最实用配置

    一.问题 我们平时开发项目,使用Maven或者Idea部署,尽可能是要做到自动化.一般情况下,做成自动化的方式有多种,下面简述我比较常用的3种. 二.解决方案一: (1)配置发部:使用IDEA自带的A ...

  3. 在verilog中使用格雷码

    格雷码的一些知识: https://baike.baidu.com/item/%E6%A0%BC%E9%9B%B7%E7%A0%81/6510858?fr=aladdin 绿色框起来的是0--15的格 ...

  4. Android 工作流提交审批填写审批意见PopWindow工具类

    公司的项目中几乎都会有走工作流这个环节,为了提高效率,现在特意把弹出的填写审批意见PopWindow改转成工具类,提高效率,免得下次又得整.先看运行效果.

  5. Android viewPager+fragment实现滑页效果

    先上图,手指在手机向左或者向右滑就可以实现相应的页面切换. 先看activity_main.xml文件,非常简单,主要是三个标题TextView和viewpager <?xml version= ...

  6. NIO的整体认识

    目录 1.Java NIO简介 2.java NIO和IO的主要区别 3.缓冲区buffer和通道channel 3.1.缓冲区buffer 3.2.channel 4.文件通道fileChannel ...

  7. Java单例模式的几种实现

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10845530.html 一:静态内部类实现单例模式 原理:通过一个静态内部类定义一个静态变量来持有当前类实例 ...

  8. [转]【会话技术】Session技术

    创建时间:6.29 & 6.30 一.Session技术 Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间  存储客户的数据,但客户端需要每次都携带一个标识ID ...

  9. python 多进程数量 对爬虫程序的影响

    1. 首先看一下 python 多进程的优点和缺点 多进程优点: 1.稳定性好: 多进程的优点是稳定性好,一个子进程崩溃了,不会影响主进程以及其余进程.基于这个特性,常常会用多进程来实现守护服务器的功 ...

  10. Comet OJ 夏季欢乐赛 烤面包片

    烤面包片 https://cometoj.com/contest/59/problem/C?problem_id=2698 题目描述 鸡尾酒最喜欢吃东北的烤面包片了.每次到东北地区的区域赛或者是秦皇岛 ...