Tri*_*ick 137 c winapi calling-convention stdcall
我正在学习Win32编程,WinMain原型如下:
int WINAPI WinMain ( HINSTANCE instance, HINSTANCE prev_instance, PSTR cmd_line, int cmd_show )
Run Code Online (Sandbox Code Playgroud)
我很困惑这个WINAPI标识符的用途和发现:
#define WINAPI __stdcall
Run Code Online (Sandbox Code Playgroud)
这是做什么的?在返回类型之后,我对此感到困惑.什么是__stdcall?当返回类型和函数名称之间有什么东西时,它是什么意思?
Rob*_*ker 159
__stdcall是用于该函数的调用约定.这告诉编译器适用于设置堆栈,推送参数和获取返回值的规则.
还有一些其他的调用约定,__cdecl,__thiscall,__fastcall和奇妙命名__naked. __stdcall是Win32系统调用的标准调用约定.
维基百科涵盖了细节.
当您调用代码之外的函数(例如OS API)或操作系统正在调用您时(例如WinMain的情况),这主要很重要.如果编译器不知道正确的调用约定,那么由于无法正确管理堆栈,您可能会遇到非常奇怪的崩溃.
Win*_*mer 10
我同意到目前为止所有的答案都是正确的,但这就是原因.Microsoft的C和C++编译器为应用程序的C和C++函数中的(预期)函数调用速度提供了各种调用约定.在每种情况下,调用者和被调用者必须就使用哪种调用约定达成一致.现在,Windows本身提供了功能(API),并且已经编译了这些功能,所以当你调用它们时,你必须遵守它们.对Windows API的任何调用以及来自Windows API的回调都必须使用__stdcall约定.
它与调用函数的方式有关 - 基本上是事物放在堆栈上的顺序以及谁负责清理.
这是文档,但除非你理解第一部分,否则它没有多大意义:http:
//msdn.microsoft.com/en-us/library/zxk0tw93.aspx
小智 5
__stdcall 用于将函数参数放入堆栈。函数完成后,它会自动释放内存。这用于固定参数。
void __stdcall fnname ( int, int* )
{
...
}
int main()
{
CreateThread ( NULL, 0, fnname, int, int*...... )
}
Run Code Online (Sandbox Code Playgroud)
这里fnname有 args,它直接压入堆栈。
| 归档时间: |
|
| 查看次数: |
98376 次 |
| 最近记录: |