实际上调用WinMain的函数是什么

时间:2013-03-04 18:52:18

标签: c winapi

WinMain()如何实际调用?我记得亲黑客使用的一个函数,它起源于__startupWinMain()

问题是,我有一个Win32 EXE(用/SUBSYSTEM:WINDOWS编译)但是从命令行获取参数。如果命令行不正确,则进程应该向控制台输出帮助消息。

如何使用FreeConsole()链接器选项从exe手动解除分配(或/SUBSYSTEM:WINDOWS)?

4 个答案:

答案 0 :(得分:3)

作为程序的第一步,请检查参数。如果他们没事,继续正常。

否则请AttachConsole通过ATTACH_PARENT_PROCESS。如果成功,则可以将错误打印到stdout并退出。如果没有,那么您必须在消息框中显示错误。

答案 1 :(得分:1)

也许您应该考虑在命令行不正确时弹出一个消息框。像这样:

MessageBox( NULL, "(description of command line error)",
            "MyProg - Command Line Error",
            MB_OK|MB_ICONEXCLAMATION );

这将在显示屏的中央打开一个消息框,等待用户在实际终止程序之前对其进行确认。

另一方面,您可以将程序构建为控制台应用程序,并使用printf()写入控制台。控制台程序仍然可以创建窗口,但是控制台本身会挂起,除非你弄清楚如何从中分离(然后,当然,你将无法再使用printf()。)

答案 2 :(得分:0)

编译器如何知道调用wWinMain而不是标准的main函数?实际发生的是Microsoft C运行时库(CRT)提供了一个调用WinMain或wWinMain的main实现。 注意CRT在main中做了一些额外的工作。例如,在wWinMain之前调用任何静态初始值设定项。虽然您可以告诉链接器使用不同的入口点函数,但如果链接到CRT,请使用默认值。否则,将跳过CRT初始化代码,结果不可预测。 (例如,不会正确初始化全局对象。)

答案 3 :(得分:0)

  

WinMain()实际上是如何调用的?

如果您在调试器中单步执行程序的第一行,然后查看堆栈,则可以看到如何调用WinMain。典型构建的实际启动功能是从运行时库中提取的函数。对我来说,它是_WinMainCRTStartup,但我想它可能会因您构建的编译器,链接器和库的版本而异。运行时库中的启动函数进行一些初始化,然后调用WinMain。

使用dumpbin /headers(或其他可以检查PE二进制文件的程序),您可以确认哪个函数是可执行文件的“入口点”。除非你已经做了一些改变,否则你可能会看到_WinMainCRTStartup,这与堆栈跟踪告诉我们的内容一致。

这应该回答你的问题,但它并不能解决你的问题。看起来其他一些人已经发布了很好的解决方案。