更新时间:2015-06-26 13:28:59浏览次数:1+次
dumpbin –exports ***.dll
要导出函数,则需要在将要被导出的函数前面添加标识符:_declspec(dllexpot)。
比如动态链接库项目名为dxDb,在动态链接库中这样写: _declspec int add(int a, int b);
这样函数add就被导出了,编译后将生成一个dxDb.lib库文件和一个dxDb.dll文件。在调用该dll库的add函数时,就需要在使用add函数之前对其做一个声明如下: extern int add(int a, int b);
或者: _declspec(dllimport) int add(int a, int b);
前面加上关键字extern表明函数是在外部定义的,_declspec(dllimport)表明函数是从动态链接库中引入的,这种方式编译器生成的代码效率更高。此时,程序编译会成功通过,但是链接会出现错误,因为虽然对函数进行了声明,但是链接器并不知道add函数是在哪个地方实现的,还要将dxDb.lib文件拷贝到调用程序所在目录下,在工程设置中添加链接dxDb.lib(或者添加语句#pragma comment(lib,"dxDb.lib"),在大熊Demo中该语句在头文件dxDb.h中);然后,为了能让调用程序找到dxDb.dll文件,还需将该文件也拷贝到调用程序所在目录下。 #ifdef DXDB_2014_DLL
#else
#define DXDB_2014_DLL _declspec(dllimport)
#pragma comment(lib,"dxDb.lib")
#endif
…
class DXDB_2014_DLL dxDb
…
我们来分析一下,首先使用条件编译指令判断是否定义了DXDB_2014_DLL符号,如果已经定义了,那么不做任何处理;否则定义该符号为_declspec(dllimport),也就是用DXDB_2014_DLL宏代替_declspec(dllimport)。然后我们在动态链接库的源程序dxDb.cpp中首先用#define定义DXDB_2014_DLL宏:#define DXDB_2014_DLL _declspec(dllexport),然后利用#include指令包含dxDb.h头文件。那么我们看一下编译过程,头文件不参与编译,在编译dxDb.cpp文件时,首先定义了DXDB_2014_DLL宏为_declspec(dllexport),然后包含dxDb.dll这一头文件,展开,首先判断DXDB_2014_DLL是否已经定义了,因为此时已定义为_declspec(dllexport),所以不再定义该宏。直接编译后面的dxDb类的声明,class DXDB_2014_DLL dxDb,表明该类是导出的,注意导出类时_declspec(dllexport)要写在class和类名dxDb之间。 LIBRARY
EXPORTS
InitConnect
UnInitConnect
SetConnectParam
GetConnectParam
ConnectDatebase
DisConnectDatebase
DataInsert
DataDelete
DataUpdate
DataQuery
相关资讯