一、_stdcall

被这个关键字修饰的函数,其参数都是从右向左通过堆栈传递的(__fastcall 的前面部分由ecx,edx传), 函数调用在返回前要由被调用者清理堆栈。

这个关键字主要见于Microsoft Visual C、C++。GNU的C、C++是另外一种修饰方式:__attribute__((stdcall))

1.

MathFunsStd.cpp:

 int _stdcall add(int a, int b)
{
return a+b;
} int _stdcall subtract(int a, int b)
{
return a-b;
} int _stdcall multiple(int a, int b)
{
return a*b;
}

MathFunsStd.def:

LIBRARY MathFunsStd

EXPORTS
add
subtract
multiple

2.MathFuns.cpp

int add(int a, int b)
{
return a+b;
} int subtract(int a, int b)
{
return a-b;
} int multiple(int a, int b)
{
return a*b;
}

MathFuns.def

LIBRARY MathFuns

EXPORTS
add
subtract
multiple

3.UseHeaderAPI

MathFunsUseHeader.h

#ifdef MathFunsUseHeaderAPI
#else
#define MathFunsUseHeaderAPI _declspec(dllimport)
#endif MathFunsUseHeaderAPI int add(int a,int b);
MathFunsUseHeaderAPI int subtract(int a,int b);
MathFunsUseHeaderAPI int multiple(int a, int b); #define MathFunsUseHeaderAPI _declspec(dllexport)
#include "MathFunsUseHeader.h"

MathFunsUseHeader.cpp

int add(int a, int b)
{
return a+b;
} int subtract(int a, int b)
{
return a-b;
} int multiple(int a, int b)
{
return a*b;
}

三、调用

/*加载dll函数调用方式为默认调用方式*/
HINSTANCE hInst = LoadLibrary(L"MathFuns.dll");
if(!hInst)
{
printf("加载MathFuns.dll失败!\n");
}
typedef int (*MathFunsAPI)(int a, int b);//定义函数指针变量类型
MathFunsAPI Add = (MathFunsAPI)::GetProcAddress(hInst,"add");
printf("5+3=%d\n",Add(,));
::FreeLibrary(hInst); //调用dll函数调用方式为_stdcall
HINSTANCE hInstStd = ::LoadLibrary(L"MathFunsStd.dll");
if(!hInstStd)
{
printf("加载MathFunsStd.dll失败!\n");
}
typedef int (_stdcall *MathFunsStdAPI)(int a, int b);//定义函数指针变量类型
MathFunsStdAPI AddStd = (MathFunsStdAPI)::GetProcAddress(hInstStd,"add");
printf("5+3=%d\n",AddStd(,));
::FreeLibrary(hInst); return ;

最新文章

  1. [LeetCode] Two Sum 两数之和
  2. Github-素材篇
  3. 实现十进制无符号整数m到十六进制数的转换功能
  4. JavaBean与Jsp
  5. 20145208 实验四 Android开发基础
  6. echarts在360中以及IE8浏览器不兼容:解决方案
  7. ASP.NET 弹出对话框和页面之间传递值的经验总结
  8. HTTP 缓存控制总结
  9. 手机开机提示SD卡受损
  10. 02函数-04-箭头函数(ES6)
  11. JAVA在不确定具体 Annotation 类型时,获得注解参数
  12. 错误:readline/readline.h:没有那个文件或目录解决方法
  13. 像调试java一样来调试Redis lua
  14. 【转】十年你能做的能得到的有多少?一个工科IT男的工作回忆
  15. 高负载均衡学习haproxy之安装与配置
  16. WhyDemo: 画线圈LineFlower
  17. Linux 系统使用 iso 镜像文件或光盘配置本地YUM 源的最简单方式
  18. Spring中基于Java的配置@Configuration和@Bean用法
  19. OAF TABLE中第一列添加事件不生效
  20. Linux简单编程学习心得

热门文章

  1. SPSS输出结果如何在word中设置小数点前面显示加0
  2. poj3669 Meteor Shower (宽度优先搜索)
  3. 结合process进程,实现进程之间的通讯Queue,稍微复杂的运用
  4. C++ std::isnan等函数的使用
  5. SQL server 查看什么语句在使用临时表
  6. 《剑指offer》面试题7 用两个栈实现队列 Java版
  7. java_第一年_JavaWeb(7)
  8. java_第一年_JavaWeb(2)
  9. 洛谷 P1892 [BOI2003]团伙(种类并查集)
  10. 物流运输(最短路+dp)