WIN32编程必知:__stdcall,__cdecl,__fastcall,thiscall,naked call
来源:互联网 发布:edge浏览器插件知乎 编辑:程序博客网 时间:2024/05/17 22:51
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”标识结束。
int Test1(char *var1,unsigned long)-----“?Test1@@YGHPADK@Z”
void Test2()-----“?Test2@@YGXXZ”
规则同上面的_stdcall调用约定,只是参数表的开始标识由上面的“@@YG”变为“@@YA”。
规则同上面的_stdcall调用约定,只是参数表的开始标识由上面的“@@YG”变为“@@YI”。
VC++对函数的省缺声明是"__cedcl",将只能被C/C++调用.
很多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中的导出函数.这个关键字也有一些其他的用法,不过非常罕见.
__declspec主要是用于说明DLL的引出函数的,在某些情况下用__declspec(dllexport)在DLL中生命引出函数,比用传统的 DEF文件方便一些.在普通程序中也可以用__declspec(dllimport)说明函数是位于另一个DLL中的导出函数.
以下是在dev-c++里建立自已的dll时的dll.h里面的代码,这里面有一个:_declspec(dllexport)
#ifndef _DLL_H_
#define _DLL_H_//防重复定义
#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */
DLLIMPORT void HelloWorld (void);
#endif /* _DLL_H_ */
上面代码里面的_delcspce(dllexport)被定义为宏,这样可以提高程序的可读性!这个的作是是将函数定义为导出函数,也就是说这个函数要被包含这个函数的程序之外的程序调用!本语句中就是:void Helloword(void):
摘自msdn:在 32 位编译器版本中,可以使用 __declspec(dllexport) 关键字从 DLL 导出数据、函数、类或类成员函数。__declspec(dllexport) 将导出指令添加到对象文件
若要导出函数,__declspec(dllexport) 关键字必须出现在调用约定关键字的左边(如果指定了关键字)。例如:
__declspec(dllexport) void __cdecl Function1(void);
若要导出类中的所有公共数据成员和成员函数,关键字必须出现在类名的左边,如下所示:
class __declspec(dllexport) CExampleExport : public CObject
{ ... class definition ... };
生成 DLL 时,通常创建一个包含正在导出的函数原型和/或类的头文件,并将 __declspec(dllexport) 添加到头文件中的声明。若要提高代码的可读性,请为 __declspec(dllexport) 定义一个宏并对正在导出的每个符号使用该宏:
#define DllExport __declspec( dllexport )
__declspec(dllexport) 将函数名存储在 DLL 的导出表中。如果希望优化表的大小
Other reference link:
http://www.eb163.com/club/thread-913-1-1.html
- WIN32编程必知:__stdcall,__cdecl,__fastcall,thiscall,naked call
- WIN32编程必知:__stdcall,__cdecl,__fastcall,thiscall,naked call
- WIN32编程必知:__stdcall,__cdecl,__fastcall,thiscall,naked call
- ,__stdcall,__cdecl,__fastcall,thiscall,naked call,__pascal
- __stdcall,__cdecl,__fastcall,thiscall,naked call
- __stdcall,__cdecl,__fastcall,thiscall,naked call (转贴)
- __stdcall,__cdecl,__fastcall,thiscall,naked call
- WIN32编程必知:__stdcall,__cdecl,__fastcall,thiscall,na
- 函数调用的区别__stdcall,__cdecl,__fastcall,thiscall,naked call
- 函数调用详解:__stdcall, __cdecl, __fastcall, thiscall, naked call, __pascal
- 函数调用,__stdcall,__cdecl,__fastcall,thiscall,naked call,__pascal
- 【转】__stdcall,__cdecl,__fastcall,thiscall,naked call的一些概念
- 论调用约定__stdcall,__cdecl,__fastcall,thiscall,naked call
- WIN32编程:__stdcall,__cdecl,__fastcall,thiscall
- WIN32编程必知:__stdcall,__cdecl,__fastcall,thiscal
- 函数命名规则及调用约定:__stdcall,__cdecl,__fastcall,thiscall,naked call
- 函数命名规则及调用约定:__stdcall,__cdecl,__fastcall,thiscall,naked call
- 函数的__cdecl、__stdcall、__fastcall、__thiscall、naked call介绍
- __cdecl,__stdcall, __declspec用法说明
- 创建透明窗体
- 通过ip获取计算机名
- HttpWebRequest使用问题
- __declspec(dllimport)和__declspec(dllexport)的区别,以及有关c/c++调用约定
- WIN32编程必知:__stdcall,__cdecl,__fastcall,thiscall,naked call
- 在Eclipse下搭建Android开发环境教程
- asp.net Request.ServerVariables 各参数说明集合
- LoadRunner脚本录制常见问题整理
- C#中使用MD5加密的方法
- 如何关闭远程连接用户
- 利用AVR单片机控制LCD320240彩屏
- ASP.net 调试错误,对象标识符没有表示一个有效的对象。(异常来自HRESULT:0x800710D8)
- [新闻] 微软九月二十九日发行一个紧急安全补丁 (MS10-070)