当前位置:  开发笔记 > 开发工具 > 正文

如果从命令行启动,则输出到命令行

如何解决《如果从命令行启动,则输出到命令行》经验,为你挑选了1个好方法。



1> Michael Burr..:

Raymond Chen最近发布了一篇关于此问题的简短文章(问题发布于SO之后一个月).

如何编写可以作为控制台或GUI应用程序运行的程序?

你不能,但你可以尝试假装它.

每个PE应用程序在其标头中包含一个字段,用于指定在其下运行的子系统.您可以说 IMAGE_SUBSYSTEM_WINDOWS_GUI将自己标记为Windows GUI应用程序,或者您可以说 IMAGE_SUBSYSTEM_WINDOWS_CUI您是一个控制台应用程序.如果您是GUI应用程序,那么程序将在没有控制台的情况下运行.

子系统确定内核如何为程序准备执行环境.如果程序在控制台子系统中标记为正在运行,则内核将程序的控制台连接到其父控制台,如果父级没有控制台,则创建新控制台.(这是一个不完整的描述,但细节与讨论无关.)另一方面,如果程序被标记为作为GUI应用程序运行,那么内核将在没有任何控制台的情况下运行程序.

在那篇文章中,他指出了Junfeng Zhang的另一篇文章,讨论了几个程序(Visual Studio和ildasm)如何实现这种行为:

如何将应用程序作为GUI和控制台应用程序?

在VisualStudio案例中,实际上有两个二进制文件:devenv.com和devenv.exe.Devenv.com是一款控制台应用.Devenv.exe是一个GUI应用程序.当您键入devenv时,由于Win32探测规则,会执行devenv.com.如果没有输入,devenv.com将启动devenv.exe,并退出.如果有输入,devenv.com会将它们作为普通的控制台应用程序处理.

在ildasm的情况下,只有一个二进制文件:ildasm.exe.它首先被编译为GUI应用程序.稍后editbin.exe用于将其标记为控制台子系统.在其主要方法中,它确定是否需要以控制台模式或GUI模式运行.如果需要以GUI模式运行,它会将自身重新启动为GUI应用程序.

在对Raymond Chen的文章的评论中,laonianren将此添加到Junfeng Zhang关于Visual Studio如何工作的简要描述中:

devenv.com是一个通用的控制台模式存根应用程序.当它运行时,它会创建三个管道来重定向控制台的stdin,stdout和stderr.然后它找到自己的名字(通常是devenv.com),用".exe"替换".com"并使用stdin管道的读取端和stdout的写入端启动新的应用程序(即devenv.exe)和stderr管道作为标准手柄.然后它就坐下来等待devenv.exe退出并在控制台和管道之间复制数据.

因此即使devenv.exe是一个gui应用程序,它也可以使用其标准句柄读写"父"控制台.

您可以将devenv.com自己用于myapp.exe,方法是将其重命名为myapp.com.但你不能在实践中因为它属于MS.

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有