DLL的Export和Import

转载 2006年06月10日 13:58:00

DLL的Export和Import


DLL的export是指将DLL中的函数和数据输出到其它程式中,以供其使用。DLL的import是指使用DLL的程式引入DLL中的函数和数据。

DLL的export

DLL中包含有一个表,称为export table(以下简称ET),其中包含了DLL中可以被外部程式使用的所有函数和数据的名字。只有记录在ET中的

函数和数据才可以被外部程式所使用(如果没有.DEF文件的话),其它所有没有记录在ET中的函数和数据都被视为是DLL私有的。因此,要将

DLL中的函数和数据export只有两个方法:

l 为DLL创建一个.DEF文件(模块定义文件),并在build该DLL时使用这个.DEF文件。使用这种方法使你可以将函数按序号export。

l 在DLL中想要export的函数和数据定义前添加_declspec(dllexport)关键字(对于函数和变量定义,加在最前面;对于class定义,加在

class关键字后),这样该函数和数据就会被添加到ET中。使用这种方法函数将按名字export。

在WINDOWS下,无论使用上述的哪一种方法,都必须要将export函数声明为_stdcall。

关于C和C++的兼容问题

如果要写C和C++兼容的DLL,因为在C和C++下使用了不同的名字修饰规则以及不同的调用约定,所以,如果DLL是用C编写和编译的,则在用于

C++模块时,函数的声明前应加上extern “C”关键字,以告诉LINKER使用C外部连接(即按照C名字修饰规则在外部模块中寻找函数);反之,

如果DLL是用C++编写和编译的,则在用于C模块时,函数的声明前要加上extern “C++”关键字。VC++通过_cplusplus宏来标识C++程式。如果

是C++程式,VC编译器就会为你定义_cplusplus宏。所以在DLL中可以使用如下的技术来解决兼容问题:

#ifdef _cplusplus

extern “C” {

#endif

// 将所有的函数声明放在这里

#ifdef _cplusplus

}

#endif


.DEF文件

     .DEF文件是包含了DLL模块信息的文本文件。其语法结构如下:

     LIBRARY DLL file name

     DESCRIPTION “descriptions”

     EXPORTS

     Function names  @nums

     LIBRARY为关键字,后面紧跟关联的DLL文件名;DESCRIPTION后为可选的描述字符串,除了增加可读性外没什么用处;EXPORTS后是export

函数的列表,首先是函数名,然后是@符号,后紧跟一十进制数,为该函数的标号,范围从1到DLL可export函数的总数。注意,这里的名字是经

过名字修饰后的函数名字,如果是DLL是用C++写的话,那么就很郁闷了。

 
     如果是扩展DLL(extension DLL),并且通过.DEF文件export,那么必须在头文件中添加如下的语句:

        #undef AFX_DATA

        #define AFX_DATA AFX_EXT_DATA

        // 头文件中的其它内容

        #undef AFX_DATA

        #define AFX_DATA

这些语句确保一些MFC中内部使用的变量被export到外部程式中。例如:在class中通过DECLARE_DYNAMIC获得的CRuntimeClass变量。否则DLL将

会无法正确地编译和连接,或外部程式无法正确连接到该DLL。

DLL的import

    外部程式的一个源文件要使用DLL中的函数和数据,就像要使用外部模块中的函数和数据一样,必须首先给出函数和数据的声明;对于

class则要给出类的定义。这就称为import。对于VC编译器,Import DLL的函数和数据的语法与一般的声明类似,但要在前面加上_declspec

(dllimport)关键字(对于函数和变量声明,加在最前面;对于class定义,加在class关键字后)。如果是函数,则该关键字是可选的,但使

用该关键字有可能会导致编译器产生较高效的代码。但对于变量和class,则必须使用该关键字。

    通过使用以下的技术,可以编写在.LIB文件和外部程序源文件通用的头文件:

         #ifdef _EXPORTING

         #define CLASS_DECLSPEC    __declspec(dllexport)

         #else

         #define CLASS_DECLSPEC    __declspec(dllimport)

         #endif

编译器提供的_EXPORTING宏可以用于标式该源文件来自DLL文件还是外部程式。

 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=460609

Dll的导入导出(export与import)

一个lib提供了许多的资源,像类、函数、结构定义等:   我们在开发环境中搜索 *.lib,会发现很多lib库,像 Winmm.lib 当我们使用timeGetTime() 时, 1. 需要在 链接器...
  • chunyexiyu
  • chunyexiyu
  • 2013年08月20日 09:37
  • 1344

DLL的Export和Import

 DLL的export是指将DLL中的函数和数据输出到其它程式中,以供其使用。DLL的import是指使用DLL的程式引入DLL中的函数和数据。 DLL的export DLL中包含有一个表,称为exp...
  • dongfengsun
  • dongfengsun
  • 2007年01月09日 10:26
  • 2823

DLL的Export和Import

DLL的export是指将DLL中的函数和数据输出到其它程式中,以供其使用。DLL的import是指使用DLL的程式引入DLL中的函数和数据。 DLL的export DLL中包含有一个表,称为expo...
  • hackerliu
  • hackerliu
  • 2010年07月09日 16:56
  • 59

dllexport、dllimport区别

以下全部是经过实际测试过的(测试环境VS2010): 要将某个库文件导出成dll的时候 可以使用dllexport、实际上也可以使用dllimport, 例如有一个类 class myclas...
  • LIYUAN123ZHOUHUI
  • LIYUAN123ZHOUHUI
  • 2016年07月22日 09:42
  • 2217

dllimport与dllexport作用与区别

我相信写WIN32程序的人,做过DLL,都会很清楚__declspec(dllexport)的作用,它就是为了省掉在DEF文件中手工定义导出哪些函数的一个方法。当然,如果你的DLL里全是C++的类的话...
  • CNHK1225
  • CNHK1225
  • 2014年08月18日 16:36
  • 4656

about dll export and import

https://gcc.gnu.org/wiki/Visibility // Generic helper definitions for shared library supp...
  • xzbaimildcat
  • xzbaimildcat
  • 2014年09月21日 22:20
  • 399

DLL export 与 DLL import

使用 __declspec(dllexport) 从 DLL 导出   Microsoft 在 Visual C++ 的 16 位编译器版本中引入了 __export,使编译器得以自动生成导出名并将...
  • yinhaijing123
  • yinhaijing123
  • 2013年05月03日 09:16
  • 376

Hive-Import/Export(导入导出)

1 官方地址 Hive 0.8.0 之后引入了EXPORT and IMPORT 命令。 EXPORT命令将表或分区的数据连同元数据一起导出到指定的输出位置(HDFS上)。然后可以将此输出位置移...
  • yu0_zhang0
  • yu0_zhang0
  • 2018年01月11日 20:01
  • 38

DLL的Export和Import及extern

DLL的export是指将DLL中的函数和数据输出到其它程式中,以供其使用。 DLL的import是指使用DLL的程式引入DLL中的函数和数据。   DLL的export DLL 中包含有一个...
  • sinat_25052035
  • sinat_25052035
  • 2016年08月23日 14:31
  • 43

es6环境中,export与import使用方法

前言 参考自阮一峰大神的教程:http://es6.ruanyifeng.com/?search=export&x=6&y=5#docs/module#export-命令 声明:如有问题,还请各位...
  • H5_QueenStyle12
  • H5_QueenStyle12
  • 2017年07月19日 17:48
  • 1175
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DLL的Export和Import
举报原因:
原因补充:

(最多只允许输入30个字)