书籍和在线资源中的大多数 Windows API hello world 程序都有固定的形式。程序以 WinMain()
开始,它创建并注册窗口并进入消息循环直到结束。
#include <windows.h>
int main(void)
{
MessageBox(NULL, "content", "title", 0);
/*
*
* code which use any functions in 'windows.h'
*
*
*/
return 0;
}
但是,这种形式也合法吗?
答案 0 :(得分:4)
首先:符号 main
和 WinMain
是约定1。使用任何一个,甚至一个完全不同的符号作为入口点,都不会改变程序的任何内容。具体来说,无论选择哪个入口点符号,都可以使用整个 Windows API。
当依赖于运行时,约定就变成了契约性的。绝大多数用 C 编写的应用程序都使用 C 运行时 (CRT)。 Microsoft 的 CRT 实现要求程序提供一个名为 main
或 WinMain
(或相应的 Unicode 变体)的入口点,它可以在初始化后调用。
Microsoft 的 CRT 是否需要 main
或 WinMain
取决于 /SUBSYSTEM 链接器选项。当以 CONSOLE
子系统为目标时,CRT 需要符号 main
。相反,当以 WINDOWS
子系统为目标时,它需要 WinMain
。
针对 CONSOLE
或 WINDOWS
子系统的可执行映像是相同的,只有一个例外:操作系统将自动为针对 CONSOLE
子系统的程序分配控制台,并且不会为面向 WINDOWS
子系统的程序分配控制台。其他都一样。
但是,这种形式也合法吗?
是的,这是完全合法的。一切都一样(以传入入口点的参数为模),但系统会为您分配一个控制台。特别是对于学习而言,这是一个很好的临时解决方案,可以获取 printf
样式的日志记录/跟踪。
1 WinMain is just the conventional name for the Win32 process entry point