DLL的Export和Import及extern

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

DLL的import是指使用DLL的程式引入DLL中的函数和数据。

DLL中包含一个表,称为export table(以下简称ET),其中包含了DLL中可以被外部程式使用的所有函数和数据的名字。只有记录在ET中的函数和数据才可以被外部程式所使用(如果 没有.DEF文件的话),其它所有没有记录在ET中的函数和数据都被视为是DLL私有的。因此,要将DLL中的函数和数据export只有两个方法:

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

2. 在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

  1. LIBRARY为关键字,后面紧跟关联的DLL文件名;
  2. DESCRIPTION后为可选的描述字符串,除了增加可读性外没什么用处;
  3. 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。

DLLimport

外部程式的一个源文件要使用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文件还是外部程式。

DLL的Export和Import及extern相关推荐

  1. ES6 模块加载export 、import、export default 、import() 语法与区别,笔记总结

    ES6模块加载export .import.export default .import() 语法与区别 在 ES6 之前,社区制定了一些模块加载方案,最主要的有 CommonJS 和 AMD 两种. ...

  2. 【DB2】db2命令Export与Import

    环境准备 1.新建表 qinys@Linux:~> db2 "create table tb1(id int,dt timestamp,name varchar(100))" ...

  3. ABAP memory中的Export和Import

    可以用于SUBMIT方式调用其他ABAP程序后,数据只能通过某个透明表暂存,在由主程序查询透明表取得结果的情况, 用memory中的Export和Import的好处是不用在通过透明表转数据了,先把子程 ...

  4. JS ES6中export和import详解

    1.Export 模块是独立的文件,该文件内部的所有的变量外部都无法获取.如果希望获取某个变量,必须通过export输出, // profile.js export var firstName = ' ...

  5. [ECMAScript] module、export、import分别有什么作用?

    [ECMAScript] module.export.import分别有什么作用? import导入模块功能.import导入的只是一个只读引用,等到脚本执行时根据引用才到模块里去取值.这也就是imp ...

  6. 命令行导出和导入数据库 How to export and import MySQL database using command line Interface...

    导出 : To export MySQL database, open putty on Windows or Terminal in either MAC or Linux OS, Go to th ...

  7. ES6模块之export和import详解

    ES6模块之export和import详解 ES6中的模块即使一个包含JS代码的文件,在这个模块中所有的变量都是对其他模块不可见的,除非我们导出它.ES6的模块系统大致分为导出(export)和导入( ...

  8. export和import的答疑

    正题如下 前提 用过ES6的人 都知道export和import 但是有没有发现,导出导入的时候总觉得和想象中的不一样,那就来看看下面的一些写法: 截图以前react项目中部分导入的写法: impor ...

  9. 关于使用export和import的2个报错

    关于使用export和import的2个报错 报错:Uncaught SyntaxError: Cannot use import statement outside a module 报错:Unca ...

最新文章

  1. 干货 | 转型人工智能,你需要掌握的八大神经网络
  2. python 安装包时出现红字_Python安装(Windows 7 8 10)
  3. 【Unity开源项目精选】Unity引擎源码的C#部分
  4. 车载系统不识别 U盘
  5. 鸟哥的Linux私房菜-合集
  6. 直击固定资产管理痛点,让企业轻松管理海量固定资产
  7. 党建管理系统开发,组织部干部人事任免平台建设方案
  8. WinPE系统对硬盘分区
  9. android版局域网限速,局域网手机WiFi网速怎么限速
  10. 共享个人整理的Python问题,有源码,分析过程,解决方案,还有时间戳做间隔
  11. java方法的通用格式,【学习笔记】使用Java读取、写入Excel全版本(包含xls、xslx格式)通用方法及代码展示(POI)...
  12. 第七周项目2建立链队算法库
  13. 十款免费的Web前端开发工具
  14. css悬停动画,CSS卡片悬停动画效果实现
  15. 课时31:永久储存:腌制一缸美味的泡菜
  16. Python中rect属性
  17. 如何生成26个英文字母
  18. Git 命令行的各种退出方式
  19. java IO读写文件详细介绍
  20. 软件构造——浅谈正则表达式

热门文章

  1. jQuery插件开发(转)
  2. 2018年6月1号(线段树(1))
  3. 【Xamarin开发 Android 系列 2】VS2015跨平台开发的几种方式
  4. 【Java】使用URL类访问互联网资源
  5. [Data Pump]impdp导入笔记
  6. 在线英文名随机生成器
  7. linux之iftop命令
  8. DIV CSS BackGround属性研究
  9. 苹果成为存储厂商的新饽饽
  10. hive学习2(Navicat连接hive)