使用vs建立动态链接库DLL过程和使用方法
1、普通导出方式,函数名字显示,创建一个DLL
然后右键-->新建一个类
添加代码
头文件添加声明:
导出的时候,编译器会考虑按照c或者c++的方式导出,c++中由于有重载存在(即函数名字相同,函数参数不同),当生成c++的导出函数的时候,就会由编译器加一堆乱七八糟的符号,并且c++的导出函数只能由c++调用,C语言等其它语言是调用不了的。
然后F7,生成
使用DLL的方法:隐式链接和显示链接,隐式链接是程序一开始就加载DLL到内存,程序终止时释放占用的内存。显示链接是程序使用dll的时候加载,使用完毕后释放内存。
(1)隐式链接:
1.将*.dll 和*.lib复制到工程目录中(注意:这里生成的DLL和lib文件。lib中存的是函数代码在什么地方,真正的二进制代码在dll中)
2.在源码中加入函数的声明:
#pragma comment(lib, "XXXX.lib")
extern "C" _declspec(dllimport) int _stdcall LearnAdd(int a,int b);//说明是全局的导入函数
extern "C" _declspec(dllimport) int _stdcall LearnSub(int a,int b);
extern "C" _declspec(dllimport) int _stdcall LearnMul(int a,int b);
extern "C" _declspec(dllimport) int _stdcall LearnDiv(int a,int b);
3. 调用
(2)显式链接的方法:函数指针
(1)只用将*.dll复制到工程目录中
(2)定义函数指针
(3)定义函数指针变量
(4)加载dll到内存中
(5)使用查找dll中要用的函数地址(使用函数名查找或者函数的序号查找)
(6)用查找的地址给函数指针赋值,然后直接调用函数。"_LearnAdd@8"是命名规则,会在原来的函数前边加下划线,8表示有2个参数(1个参数4字节)
以上导出的函数在Dependency中查看的时候,会看到函数的名字,而一个有意义的函数名一般是这个函数功能的高度概括,有时候需要把函数名字隐藏起来,就可以使用*.def,把导出函数名字隐藏:
2、使用*.def导出,隐藏函数名
1)创建一个DLL,
2)添加类
3)添加代码和声明,这里代码和声明,用普通的函数编码和声明,不用export关键字了。
4)在自己的动态链接库的项目右键->新建-->*.def,
5)编辑*.def文件
5)为刚定义的函数编辑序号和不要名字
6)F7生成。
使用*.def导出函数的