DLL头文件的格式和应用
2007-03-17 22:00:27 来源:WEB开发网核心提示: 通常情况下,为了确保不同的语言编写的可执行模块都能够正确地访问到导出函数,DLL头文件的格式和应用(2),习惯上都采用extern "C"来指定导出函数采用C链接方式,4、DLL头文件格式在实际的编程中,即使用#include "dllmodulename.h
通常情况下,为了确保不同的语言编写的可执行模块都能够正确地访问到导出函数,习惯上都采用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
从上述阐述可以看出,对于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 __cplusplus
extern "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 declarations
DLLMODULENAME_LIB_API returntype FuncName (parameters);
// ... more declarations as needs
#undef DLLMODULENAME_LIB_API
#ifdef __cplusplus
}
#endif
#endif
5、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 "dllmodulename.h"
returntype FuncName (parameters)
{
// function body
}
// other functions definitions
而在调用文件中,只需要包含头文件即可,即使用#include "dllmodulename.h"语句实现对DLL导出函数的导入声明。参考文献
Joseph M. Newcomer. The Ultimate (DLL) Header File,www.codeproject.com
《Windows核心编程》第四版,机械工业出版社
[]
更多精彩
赞助商链接