定和_fastcall 调用约定。
_stdcall 调用约定相当于 16 位动态库中经常使用的 PASCAL 调用约定。在 32 位的 Visual
C++ 6。0 中 PASCAL 调用约定不再被支持(实际上它已被定义为_stdcall 。除了_pascal 外,
_fortran 和_syscall 也不被支持),取而代之的是_stdcall 调用约定。两者实质上是一致的,即
函数的参数自右向左通过栈传递,被调用的函数在返回前清理传送参数的内存栈,但不同的
是函数名的修饰部分(具体参见下一节介绍 )。
C 调用约定(即用_cdecl 关键字说明)和_stdcall 调用约定有所不同,虽然在参数传送方
面是一样的,但 C 调用约定对于传送参数的内存栈却是由调用者来维护的(也正因为如此,
实现可变参数的函数只能使用该调用约定),另外,在函数名修饰约定方面也有所不同。
_fastcall 调用约定的主要特点就是快,因为它是通过寄存器来传送参数的(实际上,它用
ECX 和 EDX 传送前两个双字或更小的参数,剩下的参数仍旧自右向左压栈传送,被调用的
函数在返回前清理传送参数的内存栈),在函数名修饰约定方面,它和前两者均不同。
关键字_stdcall 、_cdecl 和_fastcall 可以直接加在要输出的函数前,也可以在编译环境中选
择“Setting。。。|C/C++|Code Generation”菜单命令,在如图 10…3 所示的对话框中设置编译环境。
当加在输出函数前的关键字与编译环境中的选择不同时,直接加在输出函数前的关键字有效。
它们对应的命令行参数分别为/Gz 、/Gd 和/Gr 。默认状态为/Gd ,即_cdecl 。
图 10…3 编译环境设置
如果要完全模仿 PASCAL 调用约定首先必须使用_stdcall 调用约定,至于函数名修饰约
定,可以通过其他方法模仿。另外需要注意的是 Windows。h 支持 WINAPI 宏,该宏可以将输
出函数翻译成适当的调用约定,在 WIN32 中,它被定义为_stdcall 。
2 .函数名修饰约定
函数名修饰约定随编译种类和调用约定的不同而不同,下面分别说明。对于 C 编译,
·262 ·
…………………………………………………………Page 274……………………………………………………………
第 10 章 动态链接库
_stdcall 调用约定在输出函数名前加上一个下划线前缀,后面加上一个“@ ”符号和其参数的
字节数,格式为_functionname@number 。_cdecl 调用约定仅在输出函数名前加上一个下划线
前缀,格式为_functionname 。_fastcall 调用约定在输出函数名前加上一个“@ ”符号,后面
也是一个“@ ”符号和其参数的字节数,格式为@functionname@number 。它们均不改变输出
函数名中字符的大小写,这和 PASCAL 调用约定不同,PASCAL 约定输出的函数名无任何修
饰且全部大写 。本例将给出一种完全模仿PASCAL 调用约定的方法,在 DEF 文件的 EXPORTS
段通过别名来实现。例如:
int __stdcall MyFunc (int a;double b);
void __stdcall InitCode (void);
在 DEF 文件中:
EXPORTS
MYFUNC=_MyFunc@12
INITCODE=_InitCode@0
Visual C++编译输出的函数名修饰较为复杂,编译时 stdcall 调用约定规则如下。
o 以“? ”标识函数名的开始,后跟函数名。
o 函数名后面以“@@YG”标识参数表的开始,后跟参数表。
o 参数表的第一项为该函数的返回值类型,其后依次为参数的数据类型。
o 参数表后以“@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”。
“
3 .得到没有修饰的函数名
Visual C++ 输 出 函 数 时 使 用 _declspec(dllexport) , 而 不 再 用 _export 修 饰 字 。
_declspec(dllexport)在 C 调用约定、C 编译情况下可以去掉输出函数名的下划线前缀。extern
〃C〃使得在 C++ 中使用 C 编译方式成为可能,在一个 C++文件中,用 extern 〃C〃来指明该函数
使用 C 编译方式。例如,在一个 C++文件中,有如下函数:
extern 〃C〃 {void __declspec(dllexport) __cdecl Test(int var);}
其输出函数名为 Test 。
为了方便,可以使用下列预处理语句:
#if defined(__cplusplus)
extern 〃C〃
{
#endif
// 函数原型说明
#if defined(__cplusplus)
·263 ·
…………………………………………………………Page 275……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
}
#endif
经过上面的特殊处理,不管在 C 中,还是在 C++ 中都可以得到一个无任何修饰的函数名。
如果不用_declspec(dllexport)修饰字输出函数,而用 DEF 文件来输出函数。将要输出的
函数修饰名罗列在 EXPORTS 之下,这个名字必须与定义函数的名字完全一致,如此就得到
一个没有任何修饰的函数名了。
10。4。4 模块定义文件(DEF 文件)
模块定义文件(DEF )是一个或多个用于描述 DLL 属性的模块语句组成的文本文件,每
个 DEF 文件至少必须包含以下模块定义语句。
o 第一个语句必须是 LIBRARY 语句,指出 DLL 的名字;
o EXPORTS 语句列出被导出函数的名字 ;将要输出的函数修饰名罗列在 EXPORTS 下,
这个名字必须与定义函数的名字完全一致,如此就得到一个没有任何修饰的函数名。
o 可以使用 DEs criptION 语句描述 DLL 的用途(此句可选);
o 〃;〃对一行进行注释(可选 )。
10。5 动态链接库中的资源
利用 Visual C++工具能够创建基于 MFC 的常规/扩张动态链接库,这种形式的动态链接
库可以方便地添加资源 。应用程序在调用 DLL 的时候可以很方便地使用其中的资源,这在很
大程度上方便了应用程序的编写。为了使读者理解在动态链接库中使用资源的方法,本节将
通过在动态链接库中添加对话框资源来介绍使用资源的具体过程。
实例 10…1:动态链接库中使用资源实例。源代码在光盘中“10实例 10…1vcDlgDLL”目录下。
为了能够在动态链接库中方便地使用资源,可以先创建一个“MFC AppWizard(dll) ”工
程,如图 10…4 所示。然后选择“Regular Dll using shared MFC DLL ”项,单击“Finish ”按钮
即可生成动态链接库。
小说推荐
- C语言游戏编程从入门到精通(PDF格式)
- -Page 1-Page 2-Page 3-Page 4-Page 5-Page 6-Page 7-Page 8-Page 9-Page 10-Page 11-Page 12-Page 13-Page 14
- 最新章:第4章
- oracle从入门到精通(PDF格式)
- -Page 1-Oracle 从入门到精通-Page 2-资源来自网络,仅供学习 Oracle 从入门到精通一、SQL 8
- 最新章:第37章
- php程序设计简明教程(DOC格式)
- -Page 1-PHP 程序设计简明教程PHP 讲义 第 1 页 共 90 页-Page 2-目录序 4第一章 PHP 简介 6
- 最新章:第31章
- VB2008从入门到精通(PDF格式英文版)
- -Page 1(R)The eXperT’s Voice inBeginningVB 2008From Novice to ProfessionalChristian Gross-Page 2-Page 3-Beginning VB 2008From Novice to Professional■C
- 最新章:第214章
- C语言设计
- 作者:谭浩强1 C 语言概述1.1 C语言的发展过程1.2 当代最优秀的程序设计语言1.3 C语言版本1.4 C语言的特点1.5 面向对象的程序设计语言1.6 C和C+1.7 简单的C程序介绍1.8 输入和输出函数1.9 C源程序的结构特点1.10书写程序时应遵循的规则1.11C语言的字符集1.12
- 最新章:第45章
- 设计成婚:不入豪门
- 作者:海未央《设计成婚2:名门新娘》作品介绍《名门新娘》介绍:她是骆家收养的孤女,性格因为受他的影响,变得有些古灵精怪,也懂得是非之分!他说他的一切只为他而努力,可是为什么要拒绝自己呢?什么?没有满十八岁?那今天生日,够十八岁了吧?什么,还太小?太过分了,这不是耍着自己玩吗?嘿嘿,有个邪恶的老师,那
- 最新章:第196章
- 玄学,从入门到放弃
- 《玄学,从入门到放弃》作者:李传言文案:周诣一手拿着卜卦,一手拿着《演员的自我修养,叹息良久。他本是百年前观天占星的玄术师,谁知却一朝重生现代。他只想平淡地生活下去,可天不遂人愿,他注定将在这末法时代掀起波澜!成就一代影帝!谢千仇沉默地看着他…大师,你卦和书都拿倒了#玄学,从入门到放弃,入土,删库跑
- 最新章:第86章
- C语言实例教程(PDF格式)
- -Page 1-前 言Visual C+是开发运行于Windows 95和Windows NT环境下的Win32应用程序的可视化编程工具中最重要的成员之一,它为软件开发人员提供了完整的编辑、编译和调试工具和建立于Win32 API(ApplicationProgramming Interface)基
- 最新章:第143章
- 要你言听计从
- 作者:决明第一章哈士奇,没有护卫看家的本领,对主人、客人甚至是闯空门的恶人都一样友善,咬着皮球跟小偷一块玩你丢我捡也不用太惊讶,时常被人认为忠诚度不足。贺世祺背靠在冰冷玻璃落地窗前,一整间屋子都是伸手不见五指的黑暗,也好,反正他现在什么也不需要看到,只要耳朵还有听觉就好,顺便听听贴在耳边的手机里还要
- 最新章:第28章