Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > .NET > C#.NET > DLL的Export和Import
【标  题】:DLL的Export和Import
【关键字】:DLL,Export,Import
【来  源】:http://blog.csdn.net/armman/archive/2007/04/15/1565614.aspx

DLL的Export和Import

Your Ad Here  
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文件还是外部程式。 
.NET2.0隐形的翅膀,正则表达式搜魂者【月儿原创】:【上一篇】
asp.net下拉日期控件源码:【下一篇】
【相关文章】
  • 将js文件编译成动态链接库(dll)文件
  • Windows2003系统问题:“无法加载安装程序库wbemupgd.dll,或是找不到函数OcEntry.
  • java调用C的dll
  • 如何调试用于PPC设备的dll
  • 调用DLL文件中的FORM
  • 连接DLL
  • !important和(空格)/**/:的组合技巧及其他
  • 深究跨dll的资源分配和释放问题
  • 转 J2SE:JNI:JAVA调用已经存在的动态连接库(dll)
  • 使用汇编取得PE文件导入的DLL名称和函数名称
  • 【随机文章】
  • GSP算法与PrefixSpan算法的比较
  • 引起unauthenticated user的另类原因
  • 配置英特尔® RAID控制器
  • 在ASP页里面注册DLL的VBScript CLASS
  • GSP中的XD命令
  • Hello!WinX
  • HTTP文件下载控件
  • API之网络函数
  • 教您怎么选购二手笔记本
  • Lucene 全文检索实践二
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.