转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 电脑应用 >> 电脑技术 >> 正文
DLL的Export和Import         ★★★

DLL的Export和Import

作者:闵涛 文章来源:闵涛的学习笔记 点击数:988 更新时间:2006/7/27

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文件还是外部程式。


[Web开发]JS的package/import机制的考察提纲  [Web开发]oracle Export and Import 简介
[Web开发]Xmanager用法(export DISPLAY=客户端IP:0.0)  
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · 电脑技术  · 操作系统
    · 磁盘工具  · 视音频技术
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台