这个WinMain()声明中发生了什么?

时间:2012-02-04 20:52:33

标签: c++ winapi

我正在学习关于C ++和windows api的编程。我的第一个“Hello Windows API”程序只显示一个MessageBox()。但是,我有疑问,我正在阅读的这本书没有解释。

首先,这是程序:

// HelloWin32 Program
#include<Windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    MessageBox(NULL, "This gets displayed in the message.", "This is the title bar of the message dialog.", MB_OK | MB_ICONEXCLAMATION);
}

这编译并运行正常。我的问题与说int WINAPI WinMain(...)的WinMain()声明有关。当我读它时,WinMain函数(方法?)返回一个整数。但是WINAPI沟通了什么?

显然,我正在写Windows API。 WINAPI以某种方式标记函数,以便程序使用Windows API来执行它吗?

1 个答案:

答案 0 :(得分:8)

WINAPI是一个预处理器定义,定义为__stdcall,一个调用约定;当函数在其名称前面有__stdcall时,它是编译器的一个指令,使函数使用该调用约定。这是你的函数和调用你的函数的函数都同意使用stdcall调用约定并且调用正确执行。

这是必要的,因为编译器的默认调用约定可能是也可能不是stdcall,因此您必须明确告诉编译器使其成为该函数的那种方式。 Windows API的设计者主要出于兼容性原因和stdcall调用约定的普遍性,决定使所有函数调用都使用stdcall调用约定。

此外,您可以在同一程序中使用具有不同调用约定的函数。例如,WinMain必须是stdcall,但程序的其他功能不是;他们可以使用编译器默认值。

调用约定是一种方法,用于处理参数应该在堆栈上的顺序,在函数返回时谁应该从堆栈中删除它们,在何处放置返回值,以及其他事情。不同的调用约定以不同的方式实现。最重要的是,调用者和被调用者都遵循相同的调用约定是非常重要的。有关呼叫约定的详细信息,请参阅the Wikipedia article