WinMain vs. main (C++)

Jas*_*lls 5 c++ winapi

I'm fairly new to C++, but have done some .NET programming before.

What is the difference between main(...) and WinMain(...), I wrote a program earlier with main(...) and was able to call Win32 functions just fine like I am with WinMain(...), so this leads me to ask "where would it be best to use one over the other, or does it even make a difference?"

Mat*_*lia 18

谈到Microsoft工具链,传统上,Win32 图形应用程序始终以WinMain,同时main用于控制台应用程序.

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

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

关键是,CRT寻找的默认入口点的名称/签名取决于您正在构建的应用程序的类型; 如果编译器和链接器设置为构建控制台应用程序,则它们将为其使用的GUI应用程序和dll 寻找main(wmain或者_tmain,取决于Unicode设置).WinMainDllMain


所以:

  • 使用WinMain,如果你正在建设一个GUI(=没有在启动时为它创建控制台)的应用;
  • main 用于控制台应用程序;
  • DllMain 为了一个DLL.

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