VC++ 创建及调用Dll

news/2024/7/7 18:32:08

一、_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(5,3));
::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(5,3));
::FreeLibrary(hInst);

return 0;

 

转载于:https://www.cnblogs.com/blogpro/p/11339412.html


http://www.niftyadmin.cn/n/3301782.html

相关文章

GYM 101102 J.Divisible Numbers(数论+容斥原理)

Description 给出一个长度为n的序列,q次查询,每次查询给出区间[l,r]和一个数s,s的二进制从右往左第i位表示i是否出现,统计[l,r]中有多少数可以被s所表示的这些出现的某一个数整除 Input 第一行一整数T表示用例组数,…

H5_0018:z-index失效的原因

在做的过程中,发现了一个很简单却又很多人应该碰到的问题,设置Z-INDEX属性无效。 在CSS中,只能通过代码改变层级,这个属性就是z-index, 要让z-index起作用有个小小前提,就是元素的position属性要是relative…

GYM 101102 K.Topological Sort(线段树)

Description 给出一个n个点的图,初始状态i点会向所有编号大于它的点连边,之后删去m条边,求删边之后涂的字典序最小的拓扑序 Input 第一行一整数T表示用例组数,每组用例首先输入两个整数n和m分别表示点数和要删除的边数&#xf…

软件测试和软件调试的区别

最近替客户写论文,整理提纲的时候发现他们把软件的测试和调试的部分分开写,虽然知道两者有区别但是当时根本搞不清楚应该怎么写,网上找了些资料看了以后才有些概念,现在贴出来,以后可那能用的到. 1,软件测试是找出软件已经存在的错误,而调试是定位错误,修改程序以修正错误. 2,…

总结工作中用到的ES6语法,方便工作中查看,也总结一下经验

1.模板字符串: 表现形式:${} 举例子: import axios from axios;let base https://www.baidu.com/home/msg/data/personalcontent; console.log(${base}/login,${base}/login) export const requestLogin params > { return axios.post($…

VS2008安装失败原因总结

今天系统是刚装的,今儿个也不是第一次装系统,也不是第一次装vs2008了,遇上vs2008安装出错倒是头一回。 先装系统,接着装0ffice2007,接着装ms sqlserver 2005,再装adobe cs4 master套装,一路setup,很是顺利&…

GYM 101102 L.Starry Night(贪心+dfs)

Description 给出一棵树,问通过删点最多能够把这棵树变成多少个星星,星星就是一个点周围不小于三条链且不能有分叉 Input 第一行一整数T表示用例组数,每组用例首先输入一整数n表示点数,之后n-1行每行两个整数u和v表示树上一条…

Delphi容器类之---TList、TStringList、TObjectList,以及一个例程的代码分析

转载自:http://blog.csdn.net/jqandjq/article/details/5429137 看了这里标题,大家可能以为我会谈TListBox控件,那就错了。我要谈的是Delphi提供给我们的具有列表性质的类:TStringList、TList和TObjectList。TStringList用来存放字…