Hello World
Microsoft Windows 应用程序通常编写为控制台应用程序或窗口化应用程序(还有其他类型,如服务和插件)。程序员的不同之处在于程序员提供的应用程序源的主入口点的界面不同。
当 C 或 C++应用程序启动时,可执行加载程序使用的可执行入口点是编译器提供的运行时。可执行加载程序读入可执行文件,对所需的映像执行任何修复,然后调用可执行入口点,对于 C 或 C++程序,该入口点是编译器提供的运行时。
加载程序调用的可执行入口点不是应用程序员提供的主入口点,而是编译器和创建可执行文件的链接器提供的运行时。运行时为应用程序设置环境,然后调用程序员提供的主入口点。
Windows 控制台应用程序可能具有几个略微不同的接口,用于程序员提供的主入口点。它们之间的区别在于主入口点是传统的 int main (int argc, char *argv[])
还是它是特定于 Windows 的 int _tmain(int argc, _TCHAR* argv[])
版本,它提供了应用程序参数中的宽字符。如果使用 Visual Studio 生成 Windows Win32 控制台应用程序项目,则生成的源将是 Windows 特定版本。
Windows 窗口(GUI)应用程序具有用于程序员提供的主入口点的不同接口。程序员提供的这个主要入口点具有更复杂的界面,因为 Runtime 设置了 GUI 环境并提供了附加信息以及应用程序参数。
此示例说明 Windows 窗口(GUI)主入口点界面。要探索此主题,你应该:
- 带编译器的 IDE(最好是 Visual Studio)
- C 知识
使用 IDE 创建一个空的 Win32 窗口(GUI,而不是控制台)项目。必须为窗口应用程序(而不是控制台应用程序)设置项目设置,以便链接器与正确的运行时链接。创建一个 main.c
文件,将其添加到项目中,然后键入以下代码:
#include <windows.h>
int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmdshow)
{
return MessageBox(NULL, "hello, world", "caption", 0);
}
这是我们的 Win32“Hello,world”计划。第一步是包含 Windows 头文件。所有 Windows 的主标题都是 windows.h
,但还有其他的。
WinMain
与用于控制台应用的标准 int main()
不同。接口中使用了更多参数,更重要的是,窗口应用程序的主要入口点使用与标准 C / C++不同的调用约定。
限定符 APIENTRY
表示调用约定,它是在堆栈上推送参数的顺序 † 。默认情况下,调用约定是 __cdecl
指示的标准 C 约定。但是,Microsoft 使用了一种不同类型的调用约定,即 PASCAL 约定,用于由 __stdcall
限定符指示的 Windows API 函数。APIENTRY
是 windows.h
包含的一个头文件中 __stdcall
的已定义名称(另请参阅什么是__stdcall? )。
WinMain
的下一个论点如下:
- hInst:实例句柄
- hInstPrev:前一个实例句柄。不再使用。
- cmdline:命令行参数(请参阅将 WinMain(或 wWinMain)参数传递给普通 main )
- cmdshow:表示是否应显示窗口。
我们还没有使用任何这些论点。
在 WinMain()
内部,是对 MessageBox()
的调用,它显示一个带有消息的简单对话框,一个消息框。第一个参数是所有者窗口的句柄。由于我们还没有自己的窗口,请通过 NULL
。第二个参数是正文。第三个参数是标题,第四个参数包含标志。传递 0 时,将显示默认消息框。下图剖析了消息框对话框。
好的链接:
† 仅限 32 位系统。其他架构具有不同的调用约定。