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

时间: 2025-01-01 12:01:08

DLL头文件的格式和应用的相关文章

VS2010调用matlab生成的dll, 头文件里面只有对C_API,没有对CPP_API的声明?

问题描述 VS2010调用matlab生成的dll, 头文件里面只有对C_API,没有对CPP_API的声明? 想要的是这种声明:extern LIB_mysvd_CPP_API void MW_CALL_CONV mysvd(int nargout, mwArray& s, mwArray& v, mwArray& d, const mwArray& a); 编译出来的是这种声明:extern LIB_mysvd_C_API void MW_CALL_CONV mlfMy

有dll和lib及.h头文件,安卓如何调用dll或lib中的函数?

问题描述 有dll和lib及.h头文件,安卓如何调用dll或lib中的函数? 有dll和lib及.h头文件,安卓如何调用dll或lib中的函数? 解决方案 调用不了. dll是windows操作系统专有的格式,这个不谈.dll是可执行文件,里面是x86的机器代码(不像java是中间代码). 手机用的是arm处理器,和x86在机器码上都不兼容. 解决方案二: .h .lib .dll关于.dll,.h,.lib 的用法.h头文件;.lib库文件;.dll动态链接-

visual studio-求解,vs在使用DLL,我都包含了那些需要的头文件和库目录了

问题描述 求解,vs在使用DLL,我都包含了那些需要的头文件和库目录了 就是怎么检查到动态库是否包进来了? 我出现了 error LINK2019错误,在使用DLL 的时候 解决方案 楼主还要配置过.lib的 在使用动态库的时候,往往提供两个文件:一个引入库(.lib)文件(也称"导入库文件")和一个DLL(.dll)文件.虽然引入库的后缀名也是"lib",但是,动态库的引入库文件和静态库文件有着本质的区别,对一个DLL文件来说,其引入库文件(.lib)包含该DLL

c语言-小白求教C语言头文件和源文件的关系

问题描述 小白求教C语言头文件和源文件的关系 书上说头文件一般只有声明,比如void func(void); 函数的定义则是在源文件中,那也就是说我新建的项目要使用以前项目中写过的一些函数(有相关头文件含有它们的声明),光靠把相关头文件#include进来是没用的喽? 可是为什么像stdio.h这样的可以不用包含它的源文件呢? 解决方案 stdio.h的实现在stdlib里,封装起来了,不能通过文本格式打开,防止被修改! 很多函数只提供给你头文件(相当于接口,只给用户使用),而没有具体实现的源代

C++类的设计习惯及头文件重复包含问题的解决

在设计一个类的时候,通常是将类的定义及类成员函数的声明放到头文件(即.h文件)中,将类中成员函数的实现放到源文件(即.cpp)中.对于animal类需要animal.h和animal.cpp两个文件,同样,对于fish类需要fish.h和fish.cpp.对于main()函数,我们把它单独放到EX10.cpp文件中. 往一个现有工程添加头文件(.h文件)或源文件(.cpp文件)有两种方式:一种是在打开的工程中,单击[File]→[New],在左边的Files标签页下,选择C++ Header F

解析C++/CLI之头文件、内联函数与数组

头文件与函数声明 在传统C++的设计与实现中,你可对需建模的每种类型进行定义,并把定义放在各自的头文件中:而头文件中,一般会包含类型名.成员名.及相关小型成员函数的内联定义. 与各个单独编译的源文件是通过头文件来共享信息不同,在C++/CLI中,这些信息是通过程序集来共享的.就拿常举例的Point类来说,它单独编译,并生成了一个名为"Point.dll"的程序集.任何需要某种类型定义的应用程序,都必须编译和链接带有此类型的程序集,这同时也要求此DLL形式的程序集中有完整的类型定义:同样

C/C++ 头文件作用

最近在工作当中遇到了一点小问题,关于C语言头文件的应用问题,主要还是关于全局变量的定义和声明问题.学习C语言已经有好几年了,工作使用也近半年了,但是对于这部分的东西的确还没有深入的思考过.概念上还是比较模糊的,只是之前的使用大多比较简单,并没有牵涉到太复杂的工程,所以定义和声明还是比较简单而明了了的.但是最近的大工程让我在这方面吃到了一点点苦头,虽然看了别人的代码能够很快的改正,但是这些改正背后的原因却不知道.我想大多数喜欢C语言的程序员应该是和我一样的,总喜欢去追究程序问题背后的底层原因,而这

线程-在分析图片头文件的时候有一行代码看不懂,望大神指点

问题描述 在分析图片头文件的时候有一行代码看不懂,望大神指点 最近一直在找获取网络图片的size的方式,最后得出两个结论:1 使用分线程下载下来,然后获得图片的size2 使用网络请求图片的头文件,然后从头文件中找到图片大小的信息 第一种方法需要主线程分线程切换,刷表老是出问题,先放着不管重点是想搞一下第二个方法: 在网上找到了一个博客:http://cxjwin.github.io/2013/11/05/preview_image_size/大神写的很不错,也能得出图片大小,但是其中一句代码看

C++ 学习之旅二——说一说C++头文件

  作为一个二手的.net程序员,你看到了C++头文件一定就犯迷糊了,这到底是个啥玩意.再我纠结了24个小时, google20次,度娘10下,看过10来骗文章以后,我可能稍微开窍了.我对C++头文件总结,与.net比较如下:    一.C++头文件究竟是什么,你怎么看? 每个C++/C程序通常分为两个文件.一个文件用于保存程序的声明(declaration),称为头文件.另一个文件用于保存程序的实现(implementation),称为定义(definition)文件.C++/C程序的头文件以