您的位置:首页 > 其它

Dll的导入导出(export与import)

2013-08-20 09:37 465 查看
参考:http://blog.csdn.net/ooyyee11/article/details/6894436

一个lib提供了许多的资源,像类、函数、结构定义等:

 

我们在开发环境中搜索 *.lib,会发现很多lib库,像 Winmm.lib

当我们使用timeGetTime() 时,

1. 需要在 链接器--〉输入 中添加  Winmm.lib,

2. 同时,需要包括头文件:mmsystem.h

 

基于上面这个,我们查看timeGetTime在头文件中定义:

WINMMAPI DWORD WINAPI timeGetTime(void);

把宏翻译之后是:

 __declspec(dllimport) DWORD __stdcall  timeGetTime(void);

这个就是我们常见的引入的定义了

 

1. 一般我们定义导出函数或类的时候,都会使用类似的一组宏:

#ifdef  _BASEFUNC_EXPORT_

#define  BASE_API   __declspec(dllexport)

#else

#define  BASE_API   __declspec(dllimport)

#endif

 

2. 在头文件中是用:

class BASE_API CJCJMsgCmd_PrintRoadMap : public CJCJMsgCmd 

{

...



 

3. 在dll编译时,添加预编译选项  _BASEFUNC_EXPORT_,这样 BASE_API 相当于__declspec(dllexport)

4. 在使用dll的工程中,BASE_API 相当于__declspec(dllimport)

 

 

下面为转载的一篇内容,里面详细解释了与def文件的关系:(.def文件较适用非MFC程序调用DLL)

http://blog.chinaunix.net/uid-23929779-id-3936638.html

    在C++中自建的dll定义的API,是不是应该在.def中做一个声明。 MSDN中的名词解释模块定义 (.def) 文件为链接器提供有关被链接程序的导出、属性及其他方面的信息。生成 DLL 时,.def 文件最有用。由于存在可代替模块定义语句使用的链接器选项,通常不需要 .def 文件。也可以将__declspec(dllexport) 用作指定导出函数的手段。在链接器阶段可以使用 /DEF(指定模块定义文件)链接器选项调用
.def 文件。如果生成的 .exe 文件没有导出,使用 .def 文件将使输出文件较大并降低加载速度。
      通俗解释: 在VC++中,生成DLL可以不使用.def文件。只需要在VC++的函数定义前要加 __declspec(dllexport)修饰就可以了。但是使用__declspec(dllexport)和使用.def文件是有区别的。如果 DLL是提供给VC++用户使用的,你只需要把编译DLL时产生的.lib提供给用户,它可以很轻松地调用你的DLL。但是如果你的DLL是供其他程序如 VB、delphi,以及.NET 用户使用的,那么会产生一个小麻烦。因为VC++对于 __declspec(dllexport)声明的函数会进行名称转换,如下面的函数:
__declspec(dllexport) int __stdcall IsWinNT() 会转换为IsWinNT@0,这样你在VB中必须这样声明: Declare Function IsWinNT Lib "my.dll" Alias "IsWinNT@0" () As Long @的后面的数由于参数类型不同而可能不同。这显然不太方便。所以如果要想避免这种转换,就要使用.def文件方式。 EXPORTS后面的数可以不给,系统会自动分配一个数。对于VB、PB、 Delphi用户,通常使用按名称进行调用的方式,这个数关系不大,但是对于使用.lib链接的VC程序来说,不是按名称进行调用,而是按照这个数进行调用的,所以最好给出。例子:我们用VC6.0制作一个dll,不使用.def文件,在头文件中这样写
#ifndef LIB_H #define LIB_H extern "C" int _declspec(dllexport)add(int x,int y); #endif

       如果是.def文件,可以这样 LIBRARY "xxx_dll" EXPORTS add PRIVAT

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: