c++ - 在 Windows GUI 应用程序中使用 `main()` 而不是 `WinMain()` 时究竟会产生什么不良后果?

标签 c++ winapi

There is an article about entry point on MSDN其中包含有关使用 main() 而不是 WinMain() 的警告。

The CRT does some additional work inside main. For example, any static initializers are called before wWinMain. Although you can tell the linker to use a different entry-point function, use the default if you link to the CRT. Otherwise, the CRT initialization code will be skipped, with unpredictable results. (For example, global objects will not be initialized correctly.)

不幸的是,如果我在具有 Windows 子系统设置的应用程序中使用 main() 而不是 WinMain() ,我找不到任何关于到底是什么坏后果的信息.

有没有人能告诉我,或者我怎样才能自己找到它? 衷心感谢!

最佳答案

您不能真的相信该文档,main 不会调用 WinMain。它试图警告的问题是当您使用/ENTRY 链接器开关覆盖 CRT 入口点函数时。如果您这样做,则 CRT 将无法正确初始化,并且可能不会调用构造函数。

在 Windows ABI 层,如果 IMAGE_OPTIONAL_HEADER.Subsystem设置为 IMAGE_SUBSYSTEM_WINDOWS_CUI 然后创建一个新的控制台/终端,除非父进程已经有一个控制台。 CreateProcess 的调用者可以使用 CREATE_NEW_CONSOLE 和其他标志覆盖它。

当进程启动时,Windows只是调用入口点函数(AddressOfEntryPoint),这个函数没有任何参数。

使用 Microsoft 链接器时,此函数称为 mainCRTStartup创建控制台应用程序时,WinMainCRTStartup 创建 GUI 应用程序时。如果您使用的是 C 运行时/CRT,那么这些函数会为您提供并分别调用 mainWinMain。无论哪种方式,特殊魔法都在调用您的入口点函数之前执行。

允许控制台应用程序创建普通窗口,而 GUI 应用程序可以创建控制台 (AllocConsole)。您选择哪种类型取决于您是否要为您创建控制台。如果您想将 stdout 与您手动创建的控制台相关联,则需要额外的工作。

我的建议是仅在控制台应用程序的代码中使用 main,在 GUI 应用程序中使用 WinMain,链接器和 CRT 将处理其余部分。

关于c++ - 在 Windows GUI 应用程序中使用 `main()` 而不是 `WinMain()` 时究竟会产生什么不良后果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42584364/

相关文章:

c++ - 如何获取集合中某个位置的整数?

c++ - 如何为 Visual Studio C++ 设置单元测试

winapi - WinExec 和 ShellExecute 之间有哪些区别?

c++ - 不使用 Visual C++ 编译 c++ Visual C++ 7.1 解决方案

c++ - 我的关于窗口打不开

C - WinAPI - 向线程发送消息并等待它

c++ - 什么是更好的做法? protected / setter/getter ?

c++ - 线程代码解释器中的手动操作调用(打破正常流程)

java - 执行公正的程序/脚本性能比较

c++ - 使用win32 api在qwidget中填充文本