C++编写编写DLL动态链接库的步骤与实现方法动态链接库的步骤与实现方法
本文实例讲述了C++编写DLL动态链接库的步骤与实现方法。分享给大家供大家参考,具体如下:
在写C++程序时,时常需要将一个class写成DLL,供客户端程序调用。这样的DLL可以导出整个class,也可以导出这个class的
某个方法。
一、导出整个一、导出整个class
方法很简单,只需要在类的头文件中class和类名之间加上_declspec(dllexport),同时在另外一份提供给客户端调用程序使用
的类的头文件中class和类名之间加上_declspec(dllimport)。为了能让客户端程序和DLL程序公用该类的一份头文件,通常在类
的头文件中使用宏和预编译指令来处理。如下DLLTest.h:
#ifdef DLL_TEST_API
#else
#define DLL_TEST_API _declspec(dllimport)
#endif
Class DLL_TEST_API CDLLTest
{
Public:
CDLLTest();
~CDLLTest();
int Add(int a, int b);
};
DLLTest.cpp如下:
#define DLL_TEST_API _declspec(dllexport)
#include "DLLTest.h"
这样,在DLL编译时DLL_TEST_API被定义为_declspec(dllexport),而且客户端程序编译时它被定义为_declspec(dllimport)。
二、导出这个类的某个或者某几个方法二、导出这个类的某个或者某几个方法
这时,需要将_declspec(dllexport)放到成员函数名前,如DLLTest.h:
#ifdef DLL_TEST_API
#else
#define DLL_TEST_API _declspec(dllimport)
#endif
Class CDLLTest
{
Public:
CDLLTest();
~CDLLTest();
int DLL_TEST_API Add(int a, int b);
};
但是,如果仅仅是这样的话,当客户端程序#include这个头文件后,定义DLLTest这个类的一个对象后(静态方式链接DLL),客
户端程序无法链接通过,会提示构造函数和析构函数无法解析,此时,需要将构造函数和析构函数前也加上DLL_TEST_API
宏即可。
当然这里还有个问题就是类的函数在导出后,名字会发生变化,我们可以在函数名前再加上extern “C” ,如 extern “C”
DLL_TEST_API int Add(int a ,int b);但这只解决了C与C++调用时名字变更问题,可靠的方法还是增加一个模块定义文件def,
在该文件中定义导出函数的名称,我们将在后面看到样例。
DLL编写完成后,就只剩下客户端程序如何去调用该DLL了,静态方式调用DLL和动态方式调用DLL。
一、静态方式调用一、静态方式调用DLL
这个方法就简单了,将DLLTest.h头文件和DLLTest.lib,DLLTest.dll文件拷贝到客户端程序的当前目录下,在客户端程序中
#include<DLLTest.h>,然后通过#pragma comment(lib,”DLLTest.lib”)的方式引入lib库,或者在客户端程序的工程属性里面增
加对该lib文件的引入。
然后就可以在客户端程序中如同使用本地的一个class一样使用该DLL了,如:
CDLLTest dllTest;
dllTest.Add(1,2);
二、动态方式调用二、动态方式调用DLL