(转)STDAPI释义
来源:互联网 发布:南京网络教育本科 编辑:程序博客网 时间:2024/04/28 19:17
对于一个初学者来说,对于如下函数定义,一定会有点迷惑。STDAPI DllGetClassObject(){}
也许你会问该函数定义中的STDAPI是什么东东。如果你对此迷惑,那我告诉你在WINNT.h文件中STDAPI宏定义如下:
#define STDAPI EXTERN_C HRESULT STDAPICALLTYPE
在MSDN中STDAPICALLTYPE宏有如下定义:
复制代码
1 #ifdef _WIN32 // Win32 doesn't support __export
2 #define STDAPICALLTYPE __stdcall
3 #else
4 #define STDAPICALLTYPE __export __stdcall
5 #endif
6
7 #ifdef __cplusplus
8 #define EXTERN_C extern "C"
9 #else
10 #define EXTERN_C extern
11 #endif
复制代码
由此可知,其实STDAPI只是一个宏定义。而该宏定义由两个宏定义(EXTERN_C和STDAPICALLTYPE)和HRESULT组成。经过预编译,有如下结果:
extern "c" HRESULT __stdcall
这里,我假设是在Win32情况下进行预编译处理的,所以就没有__export了。同时,定义了__cplusplus,即用C++语法。
extern "C"就不用我来说明了吧。随便一本将c/c++的语法书都会提到的。HRESULT是函数的返回值类型。而__stdcall是一种调用类型(call type)。这才是我想说的东西。
在编程时,也许你会看到函数声明或定义中会出现CALLBACK和WINAPI两个宏。其实,它们也是__stdcall的代名词。看windef.h中的内容:
1 #define CALLBACK __stdcall
2 #define WINAPI __stdcall
那么,除了__stdcall,还有别的调用类型吗?究竟什么是调用类型呢?我的理解是:调用类型就是如何使用函数参数的一种规则。有三种调用类型:__fastcall、__cdecl、__stdcall。
1、__cdecl调用类型:
这是C的调用规则。对于所有非C++成员函数或未标有__stdcall或__fastcall的函数来说,这是默认调用规则。
2、__fastcall调用类型:
从字面意思可知,这是一种快速调用。因为CPU的寄存器会被使用来存放函数参数列表中的头几个参数。而剩下参数将被从右至左地推倒堆栈上。被调用函数将从寄存器和堆栈获得函数参数。在x86中,ECX和EDX一般被用来存放开始的参数。在.NET中,为了性能上的快速,就是使用ecx和edx来实现 __fastcall的。
3、 __stdcall调用类型:
该调用只是通过堆栈来push和pop参数。push参数时,顺序是从右到左。
现在,你应该明白了吧。最后,我带一句。三种调用类型在VC编译器中对应/Gd、/Gr、/Gz三个编译选项。
也许你会问该函数定义中的STDAPI是什么东东。如果你对此迷惑,那我告诉你在WINNT.h文件中STDAPI宏定义如下:
#define STDAPI EXTERN_C HRESULT STDAPICALLTYPE
在MSDN中STDAPICALLTYPE宏有如下定义:
复制代码
1 #ifdef _WIN32 // Win32 doesn't support __export
2 #define STDAPICALLTYPE __stdcall
3 #else
4 #define STDAPICALLTYPE __export __stdcall
5 #endif
6
7 #ifdef __cplusplus
8 #define EXTERN_C extern "C"
9 #else
10 #define EXTERN_C extern
11 #endif
复制代码
由此可知,其实STDAPI只是一个宏定义。而该宏定义由两个宏定义(EXTERN_C和STDAPICALLTYPE)和HRESULT组成。经过预编译,有如下结果:
extern "c" HRESULT __stdcall
这里,我假设是在Win32情况下进行预编译处理的,所以就没有__export了。同时,定义了__cplusplus,即用C++语法。
extern "C"就不用我来说明了吧。随便一本将c/c++的语法书都会提到的。HRESULT是函数的返回值类型。而__stdcall是一种调用类型(call type)。这才是我想说的东西。
在编程时,也许你会看到函数声明或定义中会出现CALLBACK和WINAPI两个宏。其实,它们也是__stdcall的代名词。看windef.h中的内容:
1 #define CALLBACK __stdcall
2 #define WINAPI __stdcall
那么,除了__stdcall,还有别的调用类型吗?究竟什么是调用类型呢?我的理解是:调用类型就是如何使用函数参数的一种规则。有三种调用类型:__fastcall、__cdecl、__stdcall。
1、__cdecl调用类型:
这是C的调用规则。对于所有非C++成员函数或未标有__stdcall或__fastcall的函数来说,这是默认调用规则。
2、__fastcall调用类型:
从字面意思可知,这是一种快速调用。因为CPU的寄存器会被使用来存放函数参数列表中的头几个参数。而剩下参数将被从右至左地推倒堆栈上。被调用函数将从寄存器和堆栈获得函数参数。在x86中,ECX和EDX一般被用来存放开始的参数。在.NET中,为了性能上的快速,就是使用ecx和edx来实现 __fastcall的。
3、 __stdcall调用类型:
该调用只是通过堆栈来push和pop参数。push参数时,顺序是从右到左。
现在,你应该明白了吧。最后,我带一句。三种调用类型在VC编译器中对应/Gd、/Gr、/Gz三个编译选项。
0 0
- (转)STDAPI释义
- --------------------------STDAPI释义-----------------------------------
- STDAPI DllRegisterServer()
- STDAPI解析
- UML释义(三)
- UML释义(二)
- 释义
- 释义
- 释义
- java Context(上下文)释义
- java Context(上下文)释义
- Symbian中IMPORT_C关键字释义 转
- 释义Linux内核(1)-概述
- 批处理学习(4) 语句结构释义
- 批处理学习(5) 字符串处理释义
- 全面的MarkDown语法(英文释义)
- 服务器相关名称释义(nginx)
- 场效应管(FET)知识点释义
- Centos6.5搭建LDAP服务器及用户添加删除
- 程序员如何坚持写作?
- mysql存储过程详解
- 利用端口转发访问VirtualBox虚拟机中的MySQL
- Hybrid APP架构设计思路
- (转)STDAPI释义
- java Integer和int之间==的比较问题 equal
- POJ 1704 Georgia and Bob题解
- 欢迎使用CSDN-markdown编辑器
- iOS 使用可变参数va_list, 定义一个方法
- Objective-C 中nil Nil NULL NSNull 之间的区别
- nodejs的http请求是报错 socket hang up
- “判断listview的最后一项是否完全显示”的其逻辑推理和用到的API讲解,及普遍的错误使用
- 【小松教你手游开发】【unity实用技能】unity安卓游戏优化ETC压缩及Alpha通道处理