惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

有赞技术团队
有赞技术团队
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
P
Palo Alto Networks Blog
C
Cisco Blogs
The Hacker News
The Hacker News
T
Threatpost
S
Schneier on Security
K
Kaspersky official blog
Spread Privacy
Spread Privacy
博客园_首页
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
NISL@THU
NISL@THU
量子位
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Google DeepMind News
Google DeepMind News
Security Latest
Security Latest
博客园 - 司徒正美
云风的 BLOG
云风的 BLOG
博客园 - 叶小钗
H
Hackread – Cybersecurity News, Data Breaches, AI and More
N
News and Events Feed by Topic
爱范儿
爱范儿
P
Proofpoint News Feed
C
CERT Recently Published Vulnerability Notes
Project Zero
Project Zero
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Cisco Talos Blog
Cisco Talos Blog
GbyAI
GbyAI
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Apple Machine Learning Research
Apple Machine Learning Research
T
Tenable Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
V
Vulnerabilities – Threatpost
Forbes - Security
Forbes - Security
博客园 - 三生石上(FineUI控件)
C
Cyber Attacks, Cyber Crime and Cyber Security
N
News and Events Feed by Topic
V
V2EX
Webroot Blog
Webroot Blog
The Register - Security
The Register - Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
阮一峰的网络日志
阮一峰的网络日志
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Blog — PlanetScale
Blog — PlanetScale
M
MIT News - Artificial intelligence
Scott Helme
Scott Helme
Simon Willison's Weblog
Simon Willison's Weblog
L
LangChain Blog
W
WeLiveSecurity
Cloudbric
Cloudbric

博客园 - Evilbaniry

(转)浏览器的两种模式quirks mode 和strict mode Does a Nodelist contain circle? XML Dom所有的节点类型 ExtJS-2.2内存泄漏补丁 (转)VC中#pragma warning指令 #define总结 (网上资料汇集) 自已为Ext添加的DateTimeField控件(附源码) VC里一些容易混淆的地方(转) (转)GetWindowLongPtr释义 (转)消息分流器 (转)std::map的用法总结 GetModuleFileName()得到程序路径 利用GetDriveType来得到驱动器信息 makeintresource:VC MAKEINTRESOURCE 析疑 (转)c/c++的预处理定义 Stringizing Operator (#) Charizing Operator (#@) Token-Pasting Operator (##) va_start() va_end()函数应用 #ifdef __cplusplus 倒底是什么意思? (转)typedef用法小结 判断windows系统类型
(转)STDAPI释义
Evilbaniry · 2008-12-24 · via 博客园 - Evilbaniry

对于一个初学者来说,对于如下函数定义,一定会有点迷惑。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三个编译选项。