2012-02-04 57 views
4

我正在学习有关C++和编程的Windows API。我的第一个“Hello Windows API”程序只是显示一个MessageBox()。但是,我有问题,我正在阅读的这本书没有解释。WinMain()声明中发生了什么?

首先,这里的程序:

// 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执行它或什么?

回答

8

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

这是必要的,因为默认情况下调用编译器的惯例可能会或可能不会STDCALL,所以你必须明确地告诉编译器,使这种方式该功能。 Windows API的设计者决定,主要是出于兼容性原因和stdcall调用约定的普遍性,使所有函数调用都使用stdcall调用约定。

此外,您还可以在同一程序中使用不同的调用约定的功能。因此,例如,WinMain必须是标准调用,但程序的其他功能不需要;他们可以使用编译器的默认值。

一个调用约定是做这样的事情,其中​​的参数应该去堆栈,谁应该从堆栈中删除它们当函数返回时,在那里把返回值,和其他东西上的顺序的方法。不同的调用约定以不同的方式做到这一点。首先,这的主叫用户和被叫都遵循相同的调用约定这是非常重要的。有关调用约定的更多信息,请参阅the Wikipedia article

+0

它是非常重要,我理解不同的调用约定?我从来没有遇到过他们(我从C#开始)。 – quakkels 2012-02-04 21:00:05

+1

@quakkels它是非常好的,但不是绝对必要知道。如果你研究过生成的C++程序集,就有必要了解调用约定,否则它可以看作是实现细节(隐藏在“WINAPI”预处理器定义之后)。可能(虽然我没有证据),很多C++程序员在不知道调用约定的情况下编写精美的程序。尽管知道更多关于事情如何在底下工作的东西永远不是一件坏事:) – 2012-02-04 21:01:26