WinMain()
如何实际调用?我记得亲黑客使用的一个函数,它起源于__startupWinMain()
。
问题是,我有一个Win32 EXE(用/SUBSYSTEM:WINDOWS
编译)但是从命令行获取参数。如果命令行不正确,则进程应该向控制台输出帮助消息。
如何使用FreeConsole()
链接器选项从exe手动解除分配(或/SUBSYSTEM:WINDOWS
)?
答案 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
,这与堆栈跟踪告诉我们的内容一致。
这应该回答你的问题,但它并不能解决你的问题。看起来其他一些人已经发布了很好的解决方案。