您的位置:逆风者 VC++ 正文
 添加时间:2007-09-01 原文发表:2007-08-31 人气:215 来源:vckbase.com

本文章共2627字,分2页,当前第1页,快速翻页:
 

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 __cplusplus

extern "C" {

#endif



// macro define __declspec(dllexport)

#define DLLMODULENAME_LIB_API __declspec(dllexport) 



// define export functions

DLLMODULENAME_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 __cplusplus

extern "C" {

#endif



// macro define __declspec(dllimport)

#define DLLMODULENAME_LIB_API __declspec(dllimport) 



// define export functions

DLLMODULENAME_LIB_API returntype FuncName (parameters);

// ... more declarations as needs 



#undef DLLMODULENAME_LIB_API



#ifdef __cplusplus

}

#endif



#endif

 
 
本文章更多内容1 - 2 - 下一页>>
相关文章

用 Web 服务进行二进制序列化和 BinaryForm
QQ2006 界面编程之鸡蛋里挑骨头
在你的程序中如何使用CButtonST类
Buffer Overruns,portability和其它...
自动隐藏停泊窗体实现
模拟 Windows 下 CPU 占用率的控件及其实现
VC中基于 Windows 的精确定时
DLL初学者指南(非MFC)
如何使用BHO定制你的Internet Explorer浏览
使用socket套接字时的两点经验
如何在 C# 中加载自己编写的动态链接库
软件测试悖论
VC 操作 SQL Server 主从表
C语言高效编程的几招
软件框架的利器、TangramMini组件应用教程二
GDI和GDI 对象的相互转换
PE文件格式详解(下)
计算MDI子窗口数,仅显示文件夹的打开对话框
基于MFC对话框的NT服务程序框架
关于控件注册和使用许可问题的解决办法

相关评论


本文章所属分类:首页 VC++

  热门关键字: