模块定义 (.def) 文件

合集下载

MFC下DLL编程(图解)

MFC下DLL编程(图解)

MFC 下DLL 编程(图解)DLL (Dynamic Link Library ,动态链接库)是微软公司为Windows 和OS/2操作系统设计一种供应用程序在运行时调用的共享函数库。

DLL 是应用程序的一种扩展,也是软件共享和重用的传统方法。

DLL 除了可同时被多个应用程序共享外,还可以在不改变调用接口(从而不需修改使用它的应用程序)的情况下,改进和升级里面的库函数。

而且DLL 与编写它的语言无关,例如,用VC 生成的规则DLL ,可以被VB 、Delphi 等生成的应用程序使用。

DLL 可以用多种语言和工具编写,我们这里只介绍如何使用MFC 来编写和使用DLL 。

相关说明文档位于MSDN 帮助的“目录\开发工具和语言\Visual Studio\Visual C++\常见编程方法\DLL\”中。

8.1 基础本节先讨论DLL 与静态库的区别,然后列出几种适合放置DLL 的目录,最后介绍MFC DLL 的三种类型。

8.1.1 DLL 与静态链接库静态链接库Lib (Static Link Library ),是在编译的链接阶段将库函数嵌入到应用程序的内部。

如果系统中运行的多个应用程序都包含所用到的公共库函数,则必然造成很大的浪费。

这样即增加了链接器的负担,也增大了可执行程序的大小,还加大了内存的消耗。

Lib 的好处是应用程序可以独立运行,而不需要在操作系统中另外安装对应的DLL 。

而DLL 采用动态链接,对公用的库函数,系统只有一个拷贝(一般是位于系统目录的*.DLL 文件),而且只有在应用程序真正调用时,才加载到内存。

在内存中的库函数,也只有一个拷贝,可供所有运行的程序调用。

当再也没有程序需要调用它时,系统会自动将其卸载,并释放其所占用的内存空间。

参见图8-1。

图8-1 静态库函数与动态链接库的区别DLL 的缺点是应用程序不能独立运行,需要在操作系统中另外安装对应的DLL 。

例如,如果你的MFC 项目被设置成“在共享DLL 中使用MFC ”的,则虽然生成的可执行程序很使用静态库函数使用动态链接库小,但是在其他没有安装Visual C++(运行环境)的机器上是不能直接运行的,需要另外安装MFC的动态链接库(如mfc90.dll)。

如何编写dll文件

如何编写dll文件
生成一个Dll工程,然后将你的类和函数都添加进去,然后将要输出的函数在该工程下的Translate.def文件中将名字列出(注意,只要名字,不要括号、参数等);实际上和你的Exe工程没有很大的区别。
如果你要用VB用,在Dll中定义你的函数的时候前面要加上“__stdcall”关键字,否则VB没有办法使用。
——(1)Windows的系统目录:\windows\system;
——(2)DOS中path所指出的任何目录;
——(3)程序所在的目录;
一.动态链接库(DLL)结构
——DLL中定义有两种函数:导出函数(export function)和内部函数
(internal function),导出函数可以被其他模块调用,内部函数只能在DLL内部使用。我们在用C++定制DLL文件时,需要编写的就是包含导出函数表的模块 定义文件(.DEF)和实现导出函数功能的C++文件。下面以Sample.dll为例介绍DEF文件和实现文件的结构:
MFC扩展DLL一般用来提供派生于MFC的可重用的类,以扩展已有的MFC类库的功能。MFC扩展DLL使用MFC的动态链接版本。只有使用MFC动态 链接的可执行程序(无论是EXE还是DLL)才能访问MFC扩展DLL。MFC扩展DLL的另一个有用的功能是它可以在应用程序和它所加载的MFC扩展 DLL之间传递MFC和MFC派生对象的指针。在其它情况下,这样做是可能导致问题的。
非MFC DLL
静态链接到MFC的常规DLL
动态链接到MFC的常规DLL
MFC扩展DLL
其中非MFC DLL(non-MFC DLL)内部不使用MFC,调用非MFC DLL提供的导出函数的可执行程序可以使用MFC,也可以不使用MFC。一般来说,非MFC DLL的导出函数都使用标准的C接口(standard C interface)。

.def模块定义文件

.def模块定义文件

.def模块定义文件模块定义文件编辑.def即模块定义文件。

模块定义(.def) 文件为链接器提供有关被链接程序的导出、属性及其他方面的信息。

生成DLL 时,.def 文件最有用。

由于存在可代替模块定义语句使用的链接器选项,通常不需要 .def 文件。

也可以将__declspec(dllexport) 用作指定导出函数的手段。

在链接器阶段可以使用/DEF(指定模块定义文件)链接器选项调用 .def 文件。

如果生成的 .exe 文件没有导出,使用 .def 文件将使输出文件较大并降低加载速度。

目录1通俗解释2定义格式1通俗解释编辑在VC++中,生成DLL可以不使用.def文件。

只需要在VC++的函数定义前要加__declspec(dllexport)修饰就可以了。

但是使用__declspec(dllexport)和使用.def文件是有区别的。

如果DLL 是提供给VC++用户使用的,你只需要把编译DLL时产生的.lib提供给用户,它可以很轻松地调用你的DLL。

但是如果你的DLL是供其他程序如VB、delphi,以及.NET用户使用的,那么会产生一个小麻烦。

因为VC++对于__declspec(dllexport)声明的函数会进行名称转换,如下面的函数:__declspec(dllexport) int __stdcallIsWinNT()会转换为IsWinNT@0,这样你在VB中必须这样声明:Declare Function IsWinNT Lib "my.dll" Alias "IsWinNT@0" () AsLong@的后面的数由于参数类型不同而可能不同。

这显然不太方便。

所以如果要想避免这种转换,就要使用.def文件方式。

EXPORTS后面的数可以不给,系统会自动分配一个数。

对于VB、PB、Delphi用户,通常使用按名称进行调用的方式,这个数关系不大,但是对于使用.lib链接的VC程序来说,不是按名称进行调用,而是按照这个数进行调用的,所以最好给出。

汇编语言def

汇编语言def

汇编语言def模块定义文件(。

DEF)文件将要链接的程序的输出函数,属性和其他信息提供给链接器(大侠注:链接是编译过程的最终步骤)。

使用/def参数以置顶。

DEF文件名。

因为链接提供的参数(大侠注:这些参数可能来自IDE或者命令行手动指定)可能替换模块定义语句,。

DEF文件通常不是必要的。

1.模块定义语句的规则关键字不是大小写敏感的,而用户标识符则是大小写敏感的。

如ExPoRtS与EXPORTS都是可以的,但是你定义一个函数fnTest,则不能写为fntest。

常文件名包括空格或分号,必须用引号包括起来。

语句之间,关键字和参数之间用一个或多个空格、制表符或换行隔开。

冒号或者等号指明参数被零个或多个空格、制表符或换行包围。

如果使用NAME或LIBRARY,则必须在其他语句之前。

大多数语句只出现一次并接受特定的参数。

参数跟在关键字后面相同的行或后续的行中。

此后如果有使用不同参数的语句,则后面的语句会覆盖前面的语句。

SECTIONS,EXPORTS,IMPORTS可以出现多次并能拥有多个参数,参数之间以一个或多个空格、制表符或换行隔开。

关键字必须在第一个参数之前出现一次,可以在没割参数前面都出现。

许多语句于对应的LINK选项相同(大侠注:原词equivalent),请参阅对应的LINK选项以获取更多的详细说明。

以分号开始的行为注释行。

注释行不能和其他语句同在一行上,但可以在多行语句只中。

(SECTIONS和EXPORTS是多行语句。

)数字用十进制或C语言表示法。

(大侠注:0x10=16)如果一个字符参数于保留字相同,则用引号包括起来。

语法NAME[application][BASE=address]该语句指定输出文件名。

指定输出文件名与/OUT参数是等效的,而指定代码基址则于/BASE参数是等效的。

如果都已指定,那么/OUT 参数覆盖NAME语句。

3.LIBRARY语法LIBRARY[library][BASE=address]此语句告诉链接器创建一个DLL,与此同时,链接器创建一个导入库,除非对应的。

LNK2001错误

LNK2001错误

学习VC++时经常会遇到链接错误LNK2001,该错误非常讨厌,因为对于编程者来说,最好改的错误莫过于编译错误,而一般说来发生连接错误时,编译都已通过。

产生连接错误的原因非常多,尤其LNK2001错误,常常使人不明其所以然。

如果不深入地学习和理解VC++,要想改正连接错误LNK2001非常困难。

初学者在学习VC++的过程中,遇到的LNK2001错误的错误消息主要为:unresolved external symbol “symbol”(不确定的外部“符号”)。

如果连接程序不能在所有的库和目标文件内找到所引用的函数、变量或标签,将产生此错误消息。

一般来说,发生错误的原因有两个:一是所引用的函数、变量不存在、拼写不正确或者使用错误;其次可能使用了不同版本的连接库。

以下是可能产生LNK2001错误的原因:一.由于编码错误导致的LNK2001。

1.不相匹配的程序代码或模块定义(.DEF)文件能导致LNK2001。

例如,如果在C++源文件内声明了一变量“var1”,却试图在另一文件内以变量“VAR1”访问该变量,将发生该错误。

2.如果使用的内联函数是在.CPP文件内定义的,而不是在头文件内定义将导致LNK2001错误。

3.调用函数时如果所用的参数类型同函数声明时的类型不符将会产生LNK2001。

4.试图从基类的构造函数或析构函数中调用虚拟函数时将会导致LNK2001。

5.要注意函数和变量的可公用性,只有全局变量、函数是可公用的。

静态函数和静态变量具有相同的使用范围限制。

当试图从文件外部访问任何没有在该文件内声明的静态变量时将导致编译错误或LNK2001。

函数内声明的变量(局部变量)只能在该函数的范围内使用。

C++的全局常量只有静态连接性能。

这不同于C,如果试图在C++的多个文件内使用全局变量也会产生LNK2001错误。

一种解决的方法是需要时在头文件中加入该常量的初始化代码,并在.CPP文件中包含该头文件;另一种方法是使用时给该变量赋以常数。

(动态链接库)DLL编写与使用方法

(动态链接库)DLL编写与使用方法

DLL的创建与调用1、DLL的概念DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数、变量或类。

这些可以直接拿来使用。

静态链接库与动态链接库的区别:(1)静态链接库与动态链接库都是共享代码的方式。

静态链接库把最后的指令都包含在最终生成的EXE 文件中了;动态链接库不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。

(2)静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。

动态链接库的分类:Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。

非MFC动态库不采用MFC 类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC规则DLL 包含一个继承自CWinApp的类,但其无消息循环;MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。

2、创建一个DLL2.1 非MFC的DLL2.1.1声明导出函数:extern “C” __declspec(dllexport) int add(int a, int b);其中extern “C”为声明为C编译。

由于C++编译器在编译的时候会造成其函数名的该变,在其他应用程序中导致函数不可调用,而C编译器则不会在编译后改变其函数名。

这样如果用C编译的程序来调用该dll中的函数时,可能会造成找不到该函数。

__declspec(dllexport)表示该函数为DLL输出函数,即其他应用程序可以调用该函数从dll中声明输出函数有两种方式:(1)另外一种方式是采用模块定义(.def) 文件声明,.def文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。

解决DLL导入函数名称改编的最好方法

解决DLL导入函数名称改编的最好方法

测试实践丛书LoadRunner虚拟用户开发指南陈绍英金成姬冯艳硕著Publishing House of Electronics Industry北京·BEIJING262说明:本文节选自《LoadRunner虚拟用户开发指南》。

本书赠送陈绍英、金成姬两位老师共同开发的视频课程《LoadRunner性能测试快速入门》,您可以在阅读本书之前,先行学习此视频。

下载地址:/course/detail/507本书互动网订购地址:/195440本书卓越网订购地址:/dp/bkbk944864本书豆瓣页面:/subject/3670408/博文视点官方博客:/bvbook博文视点读者信箱:reader@LoadRunner虚拟用户开发指南2634.4.2 模块定义文件模块定义 (.def) 文件可以为链接器提供有关被链接程序的导出、属性及其他方面的信息,借助模块定义文件可以更有效地解决函数名称改编问题。

下面结合实例来讲解如何借助.def文件导出外部函数。

首先打开前面的工作空间Win32Dll,然后在里面创建一个空的动态链接库工程DefFileDll。

具体操作为,点击File →New,在弹出的新建对话框中切换到Project标签,如图4-34所示。

点击“OK”按钮确认后,在接下来的DLL类型对话框中选择“An empty DLL project”,点击Finish按钮。

然后在弹出的确认对话框中选中“OK”按钮,即可完成向导工作。

可以参考第4.2.1节中Win32Dll工程的创建过程。

工程创建完成后,首先添加一个C++源文件DefFileDll.cpp,然后将Win32Dll工程下Win32Dll.cpp的代码复制过来并逐行修改,最终的代码如代码清单4-10所示。

图4-34 DefFileDll工程信息设置LoadRunner虚拟用户开发指南264本例中仅须要创建C++源文件,不须要创建.h头文件。

DLL(动态链接库)详解

DLL(动态链接库)详解

DLL (动态链接库)详解动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL 是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。

动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。

函数的可执行代码位于一个DLL 中,该DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。

DLL 还有助于共享数据和资源。

多个应用程序可同时访问内存中单个DLL 副本的内容。

DLL 是一个包含可由多个程序同时使用的代码和数据的库。

目录定义DLL 的优点DLL文件损坏DLL 依赖项导出DLL 函数DLL错误的危害DLL修复方法定义DLL 的优点DLL文件损坏DLL 依赖项导出DLL 函数DLL错误的危害DLL修复方法展开定义通过使用DLL,程序可以实现模块化,由相对独立的组件组成。

例如,一个计帐程序可以按模块来销售。

可以在运行时将各个模块加载到主程序中(如果安装了相应模块)。

因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。

此外,可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。

例如,您有一个大型网络游戏,如果把整个数百MB甚至数GB的游戏的代码都放在一个应用程序里,日后的修改工作将会十分费时,而如果把不同功能的代码分别放在数个动态链接库(DLL)中,您无需重新生成或安装整个程序就可以应用更新。

下表说明了Windows 操作系统中的一些作为DLL 实现的文件:•ActiveX 控件(.ocx) 文件ActiveX 控件的一个示例是日历控件,它使您可以从日历中选择日期。

•控制面板(.cpl) 文件.cpl 文件的一个示例是位于控制面板中的项。

每个项都是一个专用DLL。

•设备驱动程序(.drv) 文件设备驱动程序的一个示例是控制打印到打印机的打印机驱动程序。

DLL 的优点1、扩展了应用程序的特性;2、可以用许多种编程语言来编写;3、简化了软件项目的管理;4、有助于节省内存;5、有助于资源共享;6、有助于应用程序的本地化;7、有助于解决平台差异;8、可以用于一些特殊的目的。

动态链接库(DLL)实验

动态链接库(DLL)实验
#ifdef DLLTEST_EXPORTS #define DLLTEST_API __declspec(dllexport) #else #define DLLTEST_API __declspec(dllimport) #endif extern "C" {
void DLLTEST_API SetLight(unsigned char data); void DLLTEST_API Ledshift(int shiftdir ,int count); void DLLTEST_API LedControl(DWORD dwCode,int shiftdir=-1); }
如果在DLL的函数的导出采用头文件的实现方法,必须将DLL 的头文件DllTest.h拷贝到在调用DLL的工程中,并在实现文 件中引用DllTest.h文件,代码如下:
#include "DllTest.h" 这样就可以使用DLL的导出函数。
如果采用模块(.def)导出DLL中实现函数,则必须在
m_bStop=TRUE; Sleep(500); } *pLightReg=~data; }
动态链接库的调用--静态调用DLL的步骤
利用生成一个DLL调用测试应用程序,并将上述编 译好的.dll和.lib文件拷贝到工程的目录下。并进行设置
动态链接库的调用--静态调用DLL的步骤
extern "C" void __declspec(dllimport) SetLight(unsigned char data);
SetLight Ledshift LedControl
采用模块定义.def导出函数声明,如果要求导出函数能够被C语言掉用,必须在函数的实现 前加 extern "C"进行修饰。

__declspec 和 DLL导出函数

__declspec 和 DLL导出函数

__cdecl和__stdcall都是函数调用规范(还有一个__fastcall),规定了参数出入栈的顺序和方法,如果只用VC编程的话可以不用关心,但是要在C++和Pascal等其他语言通信的时候就要注意了,只有用相同的方法才能够调用成功.另外,像printf这样接受可变个数参数的函数只有用cdecl才能够实现.__declspec主要是用于说明DLL的引出函数的,在某些情况下__declspec(dllexport)在DLL中生命引出函数,比用传统的DEF文件方便一些.在普通程序中也可以用__declspec(dllimport)说明函数是位于另一个DLL中的导出函数.例子不太好举啊,其实就是在函数声明的时候多加一个关键字,比如很多API函数就是象这样声明的:int WINAPI MessageBoxA(HWND,LPCSTR,LPSTR,UINT);而WINAPI实际上就是__stdcall.大多数API都采用__stdcall调用规范,这是因为几乎所有的语言都支持__stdcall调用.相比之下,__cdecl只有在C语言中才能用.但是__cdecl调用有一个特点,就是能够实现可变参数的函数调用,比如printf,这用__stdcall调用是不可能的.__fastcall这种调用规范比较少见,但是在Borland C++ Builder中比较多的采用了这种调用方式.如果有共享代码的需要,比如写DLL,推荐的方法是用__stdcall调用,因为这样适用范围最广.如果是C++语言写的代码供Delphi这样的语言调用就必须声明为__stdcall,因为Pascal不支持cdecl调用(或许Delphi的最新版本能够支持也说不定,这个我不太清楚).在其他一些地方,比如写COM组件,几乎都用的是stdcall调用.在VC或Delphi或C++Builder里面都可以从项目设置中更改默认的函数调用规范,当然你也可以在函数声明的时候加入__stdcall,__cdecl,__fastcall关键字来明确的指示本函数用哪种调用规范.__declspec一般都是用来声明DLL中的导出函数.这个关键字也有一些其他的用法,不过非常罕见.关于DLL的函数:动态链接库中定义有两种函数:导出函数(export function)和内部函数(internal function)。

详解模块定义(.def)文件

详解模块定义(.def)文件

在模块定义文件中,DESCRIPTION 仅在生成虚拟设备驱动程序 (VxD) 时有效。
EXETYPE:dynamic | dev386
在模块定义文件中,EXETYPE 仅在生成虚拟设备驱动程序 (VxD) 时有效。如果生成虚拟设备驱动程序时在模块定义文件中没有指定 EXETYPE,并且如果没有指定 /EXETYPE 链接器选项,则静态加载 (dev386) 生效。
BASE=address 参数设置操作系统用来加载 DLL 的基址。该参数重写 0x10000000 的默认 DLL 位置。有关基址的详细信息,请参阅 /BASE 选项说明。
请记住,在生成 DLL 时使用 /DLL 链接器选项。
/HEAP:reserve[,commit]
.def 文件中的 EXPORTS 语句
LINK 命令中的 /EXPORT 规范
所有这三种方法可以用在同一个程序中。LINK在生成包含导出的程序时还创建导入库,除非生成中使用了 .exp 文件。
以下是 EXPORTS 节的示例:
Visual C++ 的早期版本支持:
section [CLASS 'classname'] specifier
出于兼容性考虑,支持 CLASS 关键字,但忽略了它。
另一种指定节属性的方法是使用 /SECTION 选项。
EXPORTS
func2=func1
@ordinal 允许指定是序号而不是函数名将进入 DLL 的导出表。这有助于最小化 DLL 的大小。.LIB 文件将包含序号与函数之间的映射,这使您得以像通常在使用 DLL 的项目中那样使用函数名。
可选的 NONAME 关键字允许只按序号导出,并减小结果 DLL 中导出表的大小。但是,如果要在 DLL 上使用 GetProcAddress,则必须知道序号,因为名称将无效。

Win32下动态链接库(DLL)编程原理

Win32下动态链接库(DLL)编程原理

主题:DLL是Windows最重要的组成要素,Windows中的许多新功能、新特性都是通过DLL来实现的,因此掌握它、应用它是非常重要的。

动态链接库不仅可以作为一个运行模块,包括函数代码,而且可以包含程序以外的任何数据或资源(位图、图标等等)。

动态链接库就是给应用程序提供函数或者资源。

DLL是一种磁盘文件(通常带有DLL扩展名),它由全局数据、服务函数和资源组成,在运行时被系统加载到进程的虚拟空间中,成为调用进程的一部分。

在运行时,只有当EXE 程序确实要调用这些DLL模块的情况下,系统才会将它们装载到内存空间中。

每个进程都复制了自己的读/写全局变量。

如果想要与其它进程共享内存,必须使用内存映射文件或者声明一个共享数据段。

DLL模块需要的堆栈内存都是从运行进程的堆栈中分配出来的。

DLL文件中包含一个导出函数表。

这些导出函数由它们的符号名和称为标识号的整数与外界联系起来。

导入导出函数:在DLL代码中,必须像下面这样明确声明导出函数:__declspec(dllexport) int MyFunction(int n);但也可以在模块定义(DEF)文件中列出导出函数,不过这样做常常引起更多的麻烦。

在应用程序方面,要求像下面这样明确声明相应的输入函数:__declspec(dllimport) int MyFuncition(int n); (这是隐式链接dll)仅有导入和导出声明并不能使应用程序内部的函数调用链接到相应的DLL文件上。

应用程序的项目必须为链接程序指定所需的输入库(LIB文件)。

而且应用程序事实上必须至少包含一个对DLL 函数的调用。

隐式链接和显式链接dll显式:typedef double(SQRTPROC)(double);HINSTANCE hInstance; //设置全局变量用于存储DLL句柄SQRTPROC* pFunction; 第二个变量ShowMe是指向DLL,库中函数的指针VERIFY(hInstance=::LoadLibrary("c://winnt//system32//mydll.dll"));VERIFY(pFunction=(SQRTPROC*)::GetProcAddress(hInstance,"SquareRoot"));double d=(*pFunction)(81.0);//调用该DLL函数隐式:程序员通过静态链接方式编译生成应用程序时,应用程序中的调用函数与LIB文件中导出符号相匹配,这些符号或标识号进入到生成的EXE文件中.隐式链接和显式链接dll的区别:在隐式链接方式中,所有被应用程序调用的DLL文件都会在应用程序EXE文件加载时被加载在到内存中;但如果采用显式链接方式,程序员可以决定DLL文件何时加载或不加载。

未解决的外部符号unresolved extern symbol

未解决的外部符号unresolved extern symbol

学习VC++时经常会遇到链接错误LNK2001,该错误非常讨厌,因为对于编程者来说,最好改的错误莫过于编译错误,而一般说来发生连接错误时,编译都已通过。

产生连接错误的原因非常多,尤其LNK2001错误,常常使人不明其所以然。

如果不深入地学习和理解VC++,要想改正连接错误LNK2001非常困难。

初学者在学习VC++的过程中,遇到的LNK2001错误的错误消息主要为:unresolved external symbol “symbol”(不确定的外部“符号”)。

如果连接程序不能在所有的库和目标文件内找到所引用的函数、变量或标签,将产生此错误消息。

一般来说,发生错误的原因有两个:一是所引用的函数、变量不存在、拼写不正确或者使用错误;其次可能使用了不同版本的连接库。

以下是可能产生LNK2001错误的原因:一.由于编码错误导致的LNK2001。

1.不相匹配的程序代码或模块定义(.DEF)文件能导致LNK2001。

例如, 如果在C++源文件内声明了一变量“var1”,却试图在另一文件内以变量“VAR1”访问该变量,将发生该错误。

2.如果使用的内联函数是在.CPP文件内定义的,而不是在头文件内定义将导致LNK2001错误。

3.调用函数时如果所用的参数类型同函数声明时的类型不符将会产生LNK2001。

4.试图从基类的构造函数或析构函数中调用虚拟函数时将会导致LNK2001。

5.要注意函数和变量的可公用性,只有全局变量、函数是可公用的。

静态函数和静态变量具有相同的使用范围限制。

当试图从文件外部访问任何没有在该文件内声明的静态变量时将导致编译错误或LNK2001。

函数内声明的变量(局部变量)只能在该函数的范围内使用。

C++的全局常量只有静态连接性能。

这不同于C,如果试图在C++的多个文件内使用全局变量也会产生LNK2001错误。

一种解决的方法是需要时在头文件中加入该常量的初始化代码,并在.CPP文件中包含该头文件;另一种方法是使用时给该变量赋以常数。

windows下系统dll文件大全注释

windows下系统dll文件大全注释

windows下系统dll文件大全注释它是Dynamic Link Library 的缩写形式,DLL 是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。

动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。

函数的可执行代码位于一个DLL 中,该DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。

DLL 还有助于共享数据和资源。

多个应用程序可同时访问内存中单个DLL 副本的内容。

DLL 是一个包含可由多个程序同时使用的代码和数据的库。

例如,在Windows 操作系统中,Comdlg32 DLL 执行与对话框有关的常见函数。

因此,每个程序都可以使用该DLL 中包含的功能来实现“打开”对话框。

这有助于促进代码重用和内存的有效使用。

通过使用DLL,程序可以实现模块化,由相对独立的组件组成。

例如,一个计帐程序可以按模块来销售。

可以在运行时将各个模块加载到主程序中(如果安装了相应模块)。

因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。

此外,可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。

例如,您可能具有一个工资计算程序,而税率每年都会更改。

当这些更改被隔离到DLL 中以后,您无需重新生成或安装整个程序就可以应用更新。

下表说明了Windows 操作系统中的一些作为DLL 实现的文件:• ActiveX 控件(.o cx) 文件ActiveX 控件的一个示例是日历控件,它使您可以从日历中选择日期。

• 控制面板(.cpl) 文件.cpl 文件的一个示例是位于控制面板中的项。

每个项都是一个专用DLL。

• 设备驱动程序(.drv) 文件设备驱动程序的一个示例是控制打印到打印机的打印机驱动程序。

DLL 的优点1、扩展了应用程序的特性;2、可以用许多种编程语言来编写;3、简化了软件项目的管理;4、有助于节省内存;5、有助于资源共享;6、有助于应用程序的本地化;7、有助于解决平台差异;8、可以用于一些特殊的目的。

VisualC++6.0文件后缀说明

VisualC++6.0文件后缀说明

.SBR:VC编译器为每个OBJ文件生成的原始浏览信息文件,浏览信息维护工具(BSCMAKE)将利用SBR文件来生成BSC文件。
.TLB:OLE库文件,其中存放了OLE自动化对象的数据类型、模块和接口定义,自动化服务器通过TLB文件就能了解自动化对象的使用方法。
.WAV:声音资源文件。
.PBI、.PBO和.PBT:由VC的性能分析工具PROFILE生成并使用的三种文件。
Hale Waihona Puke .PCH:预编译头文件,比较大,由编译器在建立工程时自动生成,其中存放有工程中已经编译的部分代码,在以后建立工程时不再重新编译这些代码,以便加快整个编译过程的速度。
.PDB:程序数据库文件,在建立工程时自动生成,其中存放程序的各种信息,用来加快调试过程的速度。记录了程序有关的一些数据和调试信息。
c++ 后缀介绍
.APS:存放二进制资源的中间文件,VC把当前资源文件转换成二进制格式,并存放在APS文件中,以加快资源装载速度。资源辅助文件。
.BMP:位图资源文件。
.BSC:浏览信息文件,由浏览信息维护工具(BSCMAKE)从原始浏览信息文件(.SBR)中生成,BSC文件可以用来在源代码编辑窗口中进行快速定位。用于浏览项目信息的,如果用source brower的话就必须有这个文件。可以在project options里去掉Generate Browse Info File,这样可以加快编译进度。
.OBJ:由编译器或汇编工具生成的目标文件,是模块的二进制中间文件。
.ODL:用对象描述语言编写的源代码文件,VC用它来生成TLB文件。
.OLB:带有类型库资源的一种特殊的动态链接库,也叫对象库文件。
.OPT:VC开发环境自动生成的用来存放WorkSpace中各种选项的文件。工程关于开发环境的参数文件。如工具条位置信息等。

DLL(DynamicLinkLibraries)专题

DLL(DynamicLinkLibraries)专题

DLL(Dynamic Link Libraries)专题目录∙引言∙调用方式∙MFC中的DLL∙DLL入口函数∙关于约定∙关于DLL的函数∙模块定义文件(.DEF)∙DLL程序和调用其输出函数的程序的关系∙作者引言比较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。

可能存在一些模块的功能较为通用,在构造其它软件系统时仍会被使用。

在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序EXE文件中,会产生一些问题:一个缺点是增加了应用程序的大小,它会占用更多的磁盘空间,程序运行时也会消耗较大的内存空间,造成系统资源的浪费;另一个缺点是,在编写大的EXE程序时,在每次修改重建时都必须调整编译所有源代码,增加了编译过程的复杂性,也不利于阶段性的单元测试。

Windows系统平台上提供了一种完全不同的较有效的编程和运行环境,你可以将独立的程序模块创建为较小的DLL(Dynamic Linkable Library)文件,并可对它们单独编译和测试。

在运行时,只有当EXE程序确实要调用这些DLL模块的情况下,系统才会将它们装载到内存空间中。

这种方式不仅减少了EXE文件的大小和对内存空间的需求,而且使这些DLL模块可以同时被多个应用程序使用。

Windows自己就将一些主要的系统功能以DLL模块的形式实现。

一般来说,DLL是一种磁盘文件,以.dll、.DRV、.FON、.SYS和许多以.EXE为扩展名的系统文件都可以是DLL。

它由全局数据、服务函数和资源组成,在运行时被系统加载到进程的虚拟空间中,成为调用进程的一部分。

如果与其它DLL之间没有冲突,该文件通常映射到进程虚拟空间的同一地址上。

DLL模块中包含各种导出函数,用于向外界提供服务。

DLL可以有自己的数据段,但没有自己的堆栈,使用与调用它的应用程序相同的堆栈模式;一个DLL在内存中只有一个实例;DLL实现了代码封装性;DLL的编制与具体的编程语言及编译器无关。

微软文件后缀名解释

微软文件后缀名解释

.APS:存放二进制资源的中间文件,VC把当前资源文件转换成二进制格式,并存放在APS文件中,以加快资源装载速度。

资源辅助文件。

.BMP:位图资源文件。

.BSC:浏览信息文件,由浏览信息维护工具(BSCMAKE)从原始浏览信息文件(.SBR)中生成,BSC文件可以用来在源代码编辑窗口中进行快速定位。

用于浏览项目信息的,如果用source brower的话就必须有这个文件。

可以在project options里去掉Generate Browse Info File,这样可以加快编译进度。

.C:用C语言编写的源代码文件。

.CLW:ClassWizard生成的用来存放类信息的文件。

classwizard信息文件,ini文件的格式。

.CNT:用来定义帮助文件中“Contents”的结构。

.CPP或.CXX:用C++语言编写的源代码文件。

.CUR:光标资源文件。

.DEF:模块定义文件,供生成动态链接库时使用。

.DLG:定义对话框资源的独立文件。

这种文件对于VC工程来说并非必需,因为VC一般把对话框资源放在.RC资源定义文件中。

.DSP:VC开发环境生成的工程文件,VC4及以前版本使用MAK文件来定义工程。

项目文件,文本格式。

.DSW:VC开发环境生成的WorkSpace文件,用来把多个工程组织到一个WorkSpace中。

工作区文件,与.dsp差不多。

.EXP:由LIB工具从DEF文件生成的输出文件,其中包含了函数和数据项目的输出信息,LINK工具将使用EXP文件来创建动态链接库。

只有在编译DLL时才会生成,记录了DLL文件中的一些信息。

.H、.HPP或.HXX:用C/C++语言编写的头文件,通常用来定义数据类型,声明变量、函数、结构和类。

.HLP:Windows帮助文件。

.HM:在Help工程中,该文件定义了帮助文件与对话框、菜单或其它资源之间ID值的对应关系。

.HPJ:由Help Workshop生成的Help工程文件,用来控制Help文件的生成过程。

dll使用def文件导出类

dll使用def文件导出类

dll使⽤def⽂件导出类刚才去翻了翻,找到参考了:C++编译时函数名修饰约定规则:__stdcall调⽤约定:1、以 "? "标识函数名的开始,后跟函数名;2、函数名后⾯以 "@@YG "标识参数表的开始,后跟参数表;3、参数表以代号表⽰:X--void ,D--char,E--unsigned char,F--short,H--int,I--unsigned int,J--long,K--unsigned long,M--float,N--double,_N--bool,....PA--表⽰指针,后⾯的代号表明指针类型,如果相同类型的指针连续出现,以 "0 "代替,⼀个 "0 "代表⼀次重复;4、参数表的第⼀项为该函数的返回值类型,其后依次为参数的数据类型,指针标识在其所指数据类型前;5、参数表后以 "@Z "标识整个名字的结束,如果该函数⽆参数,则以 "Z "标识结束。

其格式为 "?functionname@@YG*****@Z "或 "?functionname@@YG*XZ ",例如int Test1(char *var1,unsigned long)-----“?Test1@@YGHPADK@Z”void Test2() -----“?Test2@@YGXXZ”__cdecl调⽤约定:规则同上⾯的_stdcall调⽤约定,只是参数表的开始标识由上⾯的 "@@YG "变为 "@@YA "。

__fastcall调⽤约定:规则同上⾯的_stdcall调⽤约定,只是参数表的开始标识由上⾯的 "@@YG "变为 "@@YI "。

如果要⽤DEF⽂件输出⼀个 "C++ "类,则把要输出的数据和成员的修饰名都写⼊.def模块定义⽂件所以... 通过def⽂件来导出C++类是很⿇烦的,并且这个修饰名是不可避免的。

VC中各种后缀文件含义

VC中各种后缀文件含义

VC中各种后缀文件含义首先要介绍的是扩展名为dsw的文件类型,这种类型的文件在VC中是级别最高的,称为Workspace文件。

在VC中,应用程序是以Project的形式存在的,Project文件以.dsp扩展名,在Workspace文件中可以包含多个Project,由Workspace文件对它们进行统一的协调和管理。

与dsw类型的Workspace文件相配合的一个重要的文件类型是以opt为扩展名的文件,这个文件中包含的是在Workspace文件中要用到的本地计算机的有关配置信息,所以这个文件不能在不同的计算机上共享,当我们打开一个Workspace文件时,如果系统找不到需要的opt类型文件,就会自动地创建一个与之配合的包含本地计算机信息的opt文件。

上面提到Project文件的扩展名是dsp,这个文件中存放的是一个特定的工程,也就是特定的应用程序的有关信息,每个工程都对应有一个dsp类型的文件。

以clw为扩展名的文件是用来存放应用程序中用到的类和资源的信息的,这些信息是VC中的ClassWizard工具管理和使用类的信息来源。

对应每个应用程序有一个readme.txt文件,这个文件中列出了应用程序中用到的所有的文件的信息,打开并查看其中的内容就可以对应用程序的文件结构有一个基本的认识。

在应用程序中大量应用的是以h和cpp为扩展名的文件,以h为扩展名的文件称为头文件。

以cpp为扩展名的文件称为实现文件,一般说来h为扩展名的文件与cpp为扩展名的文件是一一对应配合使用的,在h为扩展名的文件中包含的主要是类的定义,而在cpp为扩展名的文件中包含的主要是类成员函数的实现代码。

在应用程序中经常要使用一些位图、菜单之类的资源,VC中以rc为扩展名的文件称为资源文件,其中包含了应用程序中用到的所有的windows资源,要指出的一点是rc文件可以直接在VC集成环境中以可视化的方法进行编辑和修改。

最后要介绍的是以rc2为扩展名的文件,它也是资源文件,但这个文件中的资源不能在VC的集成环境下直接进行编辑和修改,而是由我们自己根据需要手工地编辑这个文件。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录模块定义(.def) 文件 (1)模块定义语句的规则 (2)EXPORTS (2)HEAPSIZE (4)LIBRARY (4)NAME (C/C++) (4)SECTIONS (C/C++) (5)STACKSIZE (6)STUB (6)VERSION (C/C++) (6)保留字 (7)模块定义(.def) 文件模块定义(.def) 文件为链接器提供有关被链接程序的导出、属性及其他方面的信息。

生成DLL 时,.def 文件最有用。

由于存在可代替模块定义语句使用的链接器选项,通常不需要.def 文件。

也可以将__declspec(dllexport)用作指定导出函数的手段。

在链接器阶段可以使用/DEF(指定模块定义文件)链接器选项调用.def 文件。

如果生成的.exe 文件没有导出,使用.def 文件将使输出文件较大并降低加载速度。

有关更多信息,请参见下列章节:∙模块定义语句的规则∙EXPORTS∙HEAPSIZE∙LIBRARY∙NAME (C/C++)∙SECTIONS (C/C++)∙STACKSIZE∙STUB∙VERSION (C/C++)∙保留字模块定义语句的规则下列语法规则适用于.def 文件中的所有语句。

其他适用于特定语句的规则与各语句一起加以说明。

∙语句、属性关键字和用户指定的标识符区分大小写。

∙包含空格或分号(;) 的长文件名必须用引号(") 引起。

∙使用一个或多个空格、制表符或换行符,将语句关键字同其参数分开和将各语句分开。

指定参数的冒号(:) 或等号(=) 两旁有零个或多个空格、制表符或换行符。

∙如果使用NAME或LIBRARY语句,则这些语句必须位于所有其他语句之前。

∙在.def 文件中,SECTIONS和EXPORTS 语句可以出现多次。

每个语句都可以采用多个规范,各规范间必须用一个或多个空格、制表符或换行符分开。

语句关键字必须在第一个规范的前面出现一次,并且可以在每个附加规范的前面重复。

∙许多语句都具有等效的LINK 命令行选项。

有关其他详细信息,请参见相应的LINK 选项说明。

∙.def 文件中的注释由每个注释行开始处的分号(;) 指定。

注释不能与语句共享一行,但可以在多行语句的规范间出现。

((SECTIONS和EXPORTS为多行语句。

)∙以十进制或十六进制为基础指定数值参数。

∙如果字符串参数与保留字匹配,则必须用双引号(") 将字符串参数引起。

EXPORTS引入了一个由一个或多个definitions(导出的函数或数据)组成的节。

每个定义必须在单独一行上。

EXPORTSdefinitions备注EXPORTS关键字可以在第一个定义所在的同一行或前一行上。

.def 文件可以包含一个或多个EXPORTS语句。

导出definitions 的语法为:entryname[=internalname] [@ordinal [NONAME]] [PRIVATE] [DATA]entryname是要导出的函数名或变量名。

这是必选项。

如果导出的名称与DLL 中的名称不同,则通过internalname指定DLL 中导出的名称。

例如,如果DLL 导出函数func1(),要将它用作func2(),则应指定:EXPORTSfunc2=func1@ordinal 允许指定是序号而不是函数名将进入DLL 的导出表。

这有助于最小化DLL 的大小。

.LIB 文件将包含序号与函数之间的映射,这使您得以像通常在使用DLL 的项目中那样使用函数名。

可选的NONAME关键字允许只按序号导出,并减小结果DLL 中导出表的大小。

但是,如果要在DLL 上使用GetProcAddress,则必须知道序号,因为名称将无效。

可选的PRIVATE关键字禁止将entryname放到由LINK 生成的导入库中。

它对同样是由LINK 生成的图像中的导出无效。

可选的DATA关键字指定导出的是数据,而不是代码。

例如,可以导出数据变量,如下所示:EXPORTSi DATA当对同一导出使用PRIVATE和DATA时,PRIVATE必须位于DATA的前面。

有三种导出定义的方法,按照建议的使用顺序依次为:1.源代码中的__declspec(dllexport)关键字2..def 文件中的EXPORTS语句3.LINK 命令中的/EXPORT规范所有这三种方法可以用在同一个程序中。

LINK 在生成包含导出的程序时还创建导入库,除非生成中使用了.exp 文件。

以下是EXPORTS 节的示例:EXPORTSDllCanUnloadNow @1 PRIVATE DATADllWindowName = Name DATADllGetClassObject @4 NONAME PRIVATEDllRegisterServer @7DllUnregisterServer注意,使用.def 文件从DLL 中导出变量时,不需要在变量上指定__declspec(dllexport)。

但是,在任何使用DLL 的文件中,仍必须在数据声明上使用__declspec(dllimport)。

HEAPSIZEHEAPSIZE 公开的功能与/HEAP链接器选项相同。

/HEAP:reserve[,commit]LIBRARY告知LINK 创建DLL。

LINK 同时还创建导入库,除非生成中使用了.exp 文件。

LIBRARY [library][BASE=address]备注library参数指定DLL 的名称。

也可以使用/OUT链接器选项指定DLL 输出名。

BASE=address参数设置操作系统用来加载DLL 的基址。

该参数重写0x10000000 的默认DLL 位置。

有关基址的详细信息,请参见/BASE选项说明。

请记住,在生成DLL 时使用/DLL链接器选项。

NAME (C/C++)指定主输出文件的名称。

NAME [application][BASE=address]备注另一种指定输出文件名的方法是使用/OUT链接器选项,而另一种设置基址的方法是使用/BASE链接器选项。

如果两种方法都指定了,则/OUT 重写NAME。

如果生成DLL,NAME 将只影响DLL 名。

SECTIONS (C/C++)引入了一个由一个或多个definitions(关于项目输出文件各节的访问说明符)组成的节。

SECTIONSdefinitions备注每个定义必须在单独一行上。

SECTIONS关键字可以在第一个定义所在的同一行或前一行上。

.def 文件可以包含一个或多个SECTIONS语句。

该SECTIONS语句为图像文件中的一节或多节设置属性,并可用于重写每种节类型的默认属性。

definitions 的格式为:.section_name specifier此处,.section_name 为程序图像中的节名,specifier 为下列一个或多个访问修饰符:∙EXECUTE∙READ∙SHARED∙WRITE用空格分开修饰符名。

例如:SECTIONS.rdata READ WRITESECTIONS标记definitions 节列表的开始位置。

每个定义必须在单独一行上。

SECTIONS关键字可以在第一个定义所在的同一行或前一行上。

.def 文件可以包含一个或多个SECTIONS语句。

支持SEGMENTS关键字作为SECTIONS的同义词。

Visual C++ 的早期版本支持:section [CLASS 'classname'] specifier出于兼容性考虑,支持CLASS关键字,但忽略了它。

另一种指定节属性的方法是使用/SECTION选项。

STACKSIZE设置堆栈的大小(以字节为单位)。

STACKSIZE reserve[,commit]备注另一种设置堆栈的方法是使用堆栈分配(/STACK) 选项。

有关reserve和commit 参数的详细信息,请参见关于该选项的文档。

该选项对DLL 无效STUB当用于生成虚拟设备驱动程序(VxD) 的模块定义文件时,STUB 允许指定包含将在VxD 中使用的IMAGE_DOS_HEADER 结构(在WINNT.H 中定义)而不是默认头的文件名。

STUB:filename备注另一种指定filename的方法是使用/STUB链接器选项。

在模块定义文件中,STUB 仅在生成VxD 时有效。

VERSION (C/C++)通知LINK 将一个数字放到.exe 文件或DLL 的头中。

VERSION major[.minor]备注major和minor参数是从0 到65,535 的范围内的十进制数。

默认值为0.0 版。

另一种指定版本号的方法是使用版本信息(/VERSION) 选项。

保留字下列字是为链接器保留的。

仅当将这些名称用双引号("") 括起来时,它们才可用作模块定义语句中的参数。

APPLOADER1 INITINSTANCE2 PRELOADBASE IOPL PRIVATECODE LIBRARY1 PROTMODE2 CONFORMING LOADONCALL1 PURE1DATA LONGNAMES2 READONLY DESCRIPTION MOVABLE1 READWRITEDEV386MOVEABLE1 REALMODE1 DISCARDABLE MULTIPLE RESIDENTDYNAMIC NAME RESIDENTNAME1 EXECUTE-ONLY NEWFILES2 SECTIONS EXECUTEONLY NODATA1 SEGMENTS EXECUTEREAD NOIOPL1 SHAREDEXETYPE NONAME SINGLEEXPORTS NONCONFORMING1 STACKSIZEFIXED1 NONDISCARDABLE STUBFUNCTIONS2 NONE VERSIONHEAPSIZE NONSHARED WINDOWAPIIMPORTS NOTWINDOWCOMPAT1 WINDOWCOMPAT1 链接器在遇到此术语时发出警告(“忽略”)。

不过,该保留字仍然保留。

2 链接器忽略该字,但是不发出警告。

相关文档
最新文档