DLL头文件的格式和应用.doc_第1页
DLL头文件的格式和应用.doc_第2页
DLL头文件的格式和应用.doc_第3页
DLL头文件的格式和应用.doc_第4页
DLL头文件的格式和应用.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

DLL头文件的格式和应用作者:武汉市东湖中学 朱海清 孟学桢1、DLL的起源动态链接库(DLL)是从C语言函数库和Pascal库单元的概念发展而来的。所有的C语言标准库函数都存放在某一函数库中。在链接应用程序的过程中,链接器从库文件中拷贝程序调用的函数代码,并把这些函数代码添加到可执行文件中。这种方法同只把函数储存在已编译的OBJ文件中相比更有利于代码的重用。但随着Windows这样的多任务环境的出现,函数库的方法显得过于累赘。如果为了完成屏幕输出、消息处理、内存管理、对话框等操作,每个程序都不得不拥有自己的函数,那么Windows程序将变得非常庞大。Windows的发展要求允许同时运行的几个程序共享一组函数的单一拷贝。动态链接库就是在这种情况下出现的。动态链接库不用重复编译或链接,一旦装入内存,DLL函数可以被系统中的任何正在运行的应用程序软件所使用,而不必再将DLL函数的另一拷贝装入内存。 2、DLL中函数的声明根据微软DLL的编写和调用规范,在DLL中,声明和定义导出函数时,需要在函数前使用_declspec(dllexport)关键字,以表明该函数是DLL的导出函数;在DLL的隐式调用方式中,应用程序在调用导出函数时,必须使用_declspec(dllimport)关键字先声明导入的函数。这种导入和导出函数的声明方法也符合C/C+的函数的先声明再调用的调用规范。3、DLL导出函数的链接类别及引用方式 导出函数在编译、链接过程中,可以采用C链接和C+链接两种方式,当采用C链接时,编译器不更改导出函数的名称,与之相反,当采用C+链接时,编译器则更改导出函数的名称。导出函数可以使用C语言编写,也可以使用C+语言编写。对于采用C语言编写的执行文件而言,如果调用采用C+语言编写的导出函数,应当强制指定使用C链接而不是C+链接生成导出函数库;而对于采用C+语言编写的执行文件而言,如果调用采用C语言编写的导出函数,应当强制指定使用C链接生成导出函数库。根据编译器规范,指定、声明函数使用C链接,则应当在函数声明前使用关键字extern C。通常情况下,为了确保不同的语言编写的可执行模块都能够正确地访问到导出函数,习惯上都采用extern C来指定导出函数采用C链接方式。4、DLL头文件格式在实际的编程中,通常都是把导出函数的声明统一放在一个头文件中,而其定义则根据需要分布在不同的CPP文件中,这样的实现方式比较方便对文件及其功能的管理和维护。因此,DLL头文件的格式如下:#ifndef _DLLMODULENAME_H#define _DLLMODULENAME_H/* *if using C+ Compiler to compile the file, adopting C linkage mode */#ifdef _cplusplusextern C #endif/ macro define _declspec(dllexport)#define DLLMODULENAME_LIB_API _declspec(dllexport) / define export functionsDLLMODULENAME_LIB_API returntype FuncName (parameters);/ . more declarations as needs #undef DLLMODULENAME_LIB_API#ifdef _cplusplus#endif#endif根据微软DLL隐式调用的规范,在使用导出函数前,应当首先声明该导出函数。在实际编程中,大多采用在一个头文件中,统一声明程序运行中调用到的DLL导出函数,然后在所有调用DLL导出函数的文件中,包含该头文件的方式。因此导出函数的引入头文件格式如下: #ifndef _IMPORTFUNC_H#define _IMPORTFUNC_H#ifdef _cplusplusextern C #endif/ macro define _declspec(dllimport)#define DLLMODULENAME_LIB_API _declspec(dllimport) / define export functionsDLLMODULENAME_LIB_API returntype FuncName (parameters);/ . more declarations as needs #undef DLLMODULENAME_LIB_API#ifdef _cplusplus#endif#endif从上述阐述可以看出,对于DLL导出函数而言,在DLL头文件中声明了一次,而在隐式调用时,又声明了一次,为消除这种重复声明和减少文件数量,实际应用中通常将两个头文件合并成一个DLL头文件,同时定义一个宏,用于控制函数处于导出声明或调用导入声明状态。对于DLL定义文件,在包含DLL头文件之前,首先定义一个控制宏,用于声明所有的函数为导出函数;而在隐式调用中,在包含DLL头文件时不需要定义控制宏,用于声明所有的函数为导入函数。因此最终的DLL头文件格式如下: #ifndef _DLLMODULENAME_H#define _DLLMODULENAME_H#include #include /* *if using C+ Compiler to compile the file, adopting C linkage mode */#ifdef _cplusplusextern C #endif/ according to the control macro, deciding whether export or import functions#ifdef _DLLMODULENAME_#define DLLMODULENAME_LIB_API _declspec(dllexport)#else#define DLLMODULENAME_LIB_API _declspec(dllimport)#endif/ functions declarationsDLLMODULENAME_LIB_API returntype FuncName (parameters);/ . more declarations as needs#undef DLLMODULENAME_LIB_API#ifdef _cplusplus#endif#endif5、DLL头文件的使用 DLL导出函数的链接、导入、导出指示符在函数第一次声明时确定,在以后的函数声明和定义时,函数都接受第一次函数的链接、导入、导出声明,不必再次对函数作链接、导入、导出声明,因此DLL导出函数的定义文件中,可以使用如下的编码格式: /* *ensure compiler to compile correctly, through including * the precompiled headers, or else resulting in C1010 error */#include stdafx.h#define _DLLMODULENAME_#include

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论