WinMain vs. main(C ++)

时间:2013-09-10 01:22:19

标签: c++ winapi

我是C ++的新手,但之前做过一些.NET编程。

main(...)WinMain(...)之间的区别是什么,我之前用main(...)编写了一个程序,并且可以像调用WinMain(...)一样调用Win32函数,所以这引出我问“哪一个最好用在另一个上面,或者它甚至会产生影响?”

2 个答案:

答案 0 :(得分:18)

谈到Microsoft工具链,传统上,Win32 图形应用程序始终以WinMain开头,而main用于控制台应用程序。

两种应用程序之间的差异实际上可以归结为(大部分)可执行文件中的单个设置,而不是功能 - GUI应用程序可以创建控制台和控制台应用程序可以创建一个窗口 - 但是在加载器的行为中:对于标记为GUI的exe,加载器不会分配任何控制台,而控制台exe将附加到父控制台或创建一个新的控制台(如果没有)。

对于入口点名称,它只是链接器/ CRT默认值的问题:可执行文件的“真实”入口点只是最终可执行文件的偏移量,指向不带参数的函数。这是CRT做它的东西,确定参数,然后调用“你的”入口点,因此,根据原则,它们都可以完全相同的方式工作。

重点是,CRT寻找的默认入口点的名称/签名取决于您正在构建的应用程序类型;如果编译器和链接器设置为构建控制台应用程序,那么对于他们使用的GUI应用程序,他们将查找main(或wmain_tmain,具体取决于Unicode设置){ {1}}和WinMain表示dll。


所以:

  • 如果您正在构建GUI(=在启动时没有为其创建控制台)应用程序,请使用DllMain;
  • WinMain用于控制台应用程序;
  • main获取dll。

同样,这一切都不是一成不变的(并且有一些方法可以从标准DllMain启动GUI应用程序),但“在罗马时,像罗马人那样做” - 也就是说它通常是最好的遵循平台的使用,以避免混淆其他开发人员,并通过未经测试/不支持的编译器设置只是为了更改入口点的签名。

答案 1 :(得分:1)

WinMain()是Windows特定的基于Windows的图形应用程序的入口点(你有windows的东西)。 main()是标准的C ++入口点(在Windows中,它是基于控制台的应用程序).​​..

也就是说,您可以在控制台应用程序中使用GUI内容并在GUI应用程序中分配控制台。

我建议您在MSDN上的Windows中consolesGUI applications阅读。