模块定义 (.def) 文件
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文件

如果你要用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) 文件为链接器提供有关被链接程序的导出、属性及其他方面的信息。
生成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文件名。
因为链接提供的参数(大侠注:这些参数可能来自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错误

学习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的创建与调用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导入函数名称改编的最好方法
测试实践丛书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,是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)实验
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导出函数
__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)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 链接器忽略该字,但是不发出警告。