如何在C ++的Win32项目中使用除main()之外的入口点。 (WinMain中)

时间:2018-02-17 22:44:58

标签: c++

从我读过的有关C和C ++的书中我了解到C程序中的入口必须是主要的。到目前为止我只创建了控制台应用程序,现在我开始学习Windows应用程序。所以我的问题是:

为什么Win32项目中的入口点不是主要的(但是WinMain)以及如何才能有所不同(可能主要调用WinMain?)?

PS。抱歉英文不好

3 个答案:

答案 0 :(得分:4)

C ++确实需要main成为"入口点"该计划,至少在所谓的“托管实施”和#34; (你可能正在使用的那些)。如果您忘记定义main

,这就是GCC发生链接器错误的原因

然而,在实践中,程序结束的差距和"运行时"开始,让事情看起来更加毛茸茸 - 当你的程序启动时,调用的第一个函数实际上是在运行时内,最终会调用main。实际上,如果您忘记定义main,则会导致链接器错误。

Microsoft决定,对于Windows GUI程序,不是调用main,而是运行时将调用WinMain。因此,您必须为要查找的函数WinMain定义,而不是main。从技术上讲,这违反了C ++标准,但它起作用,因为微软使它有效。

答案 1 :(得分:2)

代码中入口点的实际名称和签名由您决定在EXE中使用的运行时框架决定。

当OS执行EXE时,它首先调用链接器在EXE头中指定的入口点,并且通常位于编译器供应商的运行时库中。

运行时库的入口点初始化库,设置全局变量等,然后最终调用代码必须实现的入口点(运行时库包含对外部入口点的引用,并且链接器连接代码的进入该参考点。)

因此,代码的入口点是运行时库所要求的。 C / C ++中控制台应用程序的标准入口点为main,Windows GUI应用程序的传统入口点为WinMain。但就操作系统而言,这不是一项要求。

答案 2 :(得分:1)

事实上,main只是汇编语言的名称:您可以随意声明Entry Point,例如:

.code

START:
ret
END START

但是在C ++中它不允许你定义自己的EP。所以必须实现约定:对于控制台,你需要main,wmain,win32:WinMain,对于Dll:dllmain ......