注意:32DLL或应用程序转成64为的不能只是把界面中选一下,尤其是多项目的解决方案,要在属性中添加X64后在编译
一、生成dll
方法一、使用__declspec(dllexport) 见例子如下在头文件中:
函数:int __declspec(dllexport) int Add(int a,int b);
类:class __declspec(dllexport) COleFont : public COleDispatchDriver //类直接导出
方法二、使用def文件导出
函数例子如下:
LIBRARY
EXPORTS
; 此处可以是显式导出
Add @1
Sub @2 //@2不加也可以
c++类:链接http://www.bubuko.com/infodetail-486525.html和http://blog.163.com/hbu_lijian/blog/static/1261291532013031101546987/
都说“如果你的DLL里全是C++的类的话,你无法在DEF里指定导出的函数,只能用__declspec(dllexport)导出类”
但在链接“http://blog.sina.com.cn/s/blog_81c6474c01015x1a.html”中是说明如何做的,我在vs2012中招做了,但是生成映射文件中没有构造函数和析构函数的map文件,只有成员函数。只在def文件中添加成员函数的导出,调用dll的例子提示找不到构造和析构函数,提示map的位置和链接上的一样,单我把复制到def文件中,dll工程就编译不过了。
我现在也不知道“def”的方式可不可以把类及其成员函数导出?如有大神知道可以密我聊哦。
def文件添加方式如下图:
二、调用dll
1、生命本例库工程和调用库工程的工程在一个解决方案中。
首先要有一个lib、dll和.h
2、添加.h,右键工程添加现有项,添加lujing
添加$(SolutionDir)\dlltest,也可以是绝对路径,但这样解决方案移动后就编译不过
3、添加lib
在红色区域添加lib库,然后田间lib库所在的位置
把lib所在的路径加入$(SolutionDir)\Debug,可以是绝对路径,但这样不能移动工程
4、把dll复制到生的exe所在的路径,或配置属性->调试->环境:输入path=包含dll文件的文件夹路径
这样的好处是可以调试库函数。
方法2:
#pragma comment (lib,"*.lib")
加入预编译指令#pragma comment (lib,"*.lib"),这种方法优点是可以利用条件预编译指令链接不同版本的LIB文件。因为,在Debug方式下,产生的LIB文件是Debug版本,如Regd.lib;在Release方式下,产生的LIB文件是Release版本,如Regr.lib。然后在首先要使用该函数的地方加上该LIB的头文件,如#include "..\lib.h"即可(没有头文件当然就不用了)。
方法3:显式的调用链接库
隐式链接虽然实现较简单,但除了必须的*.dll文件外还需要DLL的*.h文件和*.lib文件,在那些只提供*.dll文件的场合就无法使用,而只能采用显式链接的方式。这种方式通过调用API函数来完成对DLL的加载与卸载,能更加有效地使用内存,在编写大型应用程序时往往采用此方式。这种方法编程具体实现步骤如下:
①使用Windows API函数Load Library或者MFC提供的AfxLoadLibrary将DLL模块映像到进程的内存空间,对DLL模块进行动态加载。
②使用GetProcAddress函数得到要调用DLL中的函数的指针。
③不用DLL时,用Free Library函数或者AfxFreeLibrary函数从进程的地址空间显式卸载DLL。
方法3:参考https://zhidao.baidu.com/question/1177981710216857219.html
————————————————
版权声明:本文为CSDN博主「woquNOKIA」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/woquNOKIA/article/details/51820033