通过Cmd启动Windows应用程序与控制台应用程序的区别

13

我有一个好奇的问题,关于通过Cmd运行应用程序时控制台与Windows应用程序之间的区别。如果将应用程序编译为控制台应用程序(将其称为ConApp),则在通过cmd运行应用程序时,提示符会等待应用程序完成运行后才继续。但是,如果将应用程序编译为Windows应用程序(将其称为WinApp),则通过cmd启动应用程序时,提示符将自动快速执行该应用程序。
为了让WinApp停止快速执行,用户需要在cmd中以类似于“start \wait WinApp.exe”的方式启动应用程序,这将使Cmd提示符等待WinApp停止运行后才继续。
我的问题是,控制台应用程序如何通知Cmd或者Cmd怎样才能知道需要保持开放状态而不是快速执行ConApp?是否可以调用同样的行为使得WinApp也能像ConApp一样运行并等待?


注:
我已经尝试使用AllocConsole和AttachConsole,但在我的WinApp中使用AttachConsole(-1)时,Cmd仍然快速执行WinApp,但WinApp似乎只是打开了一个新的控制台窗口。


你对技术细节感兴趣还是想知道如何将程序从“fire-and-forget”模式改为等待模式? - Scott Chamberlain
1
可执行文件是控制台模式应用程序还是本机Windows应用程序记录在EXE文件的头部。Cmd.exe查看它以了解要做什么。这不会帮助您解决任何问题。 - Hans Passant
2个回答

7
这些信息存储在EXE二进制格式的PEOptHeader部分中。具体来说,Subsystem字段告诉操作系统这是哪种类型的应用程序,并且可以有以下值:
  • 1:本地应用程序
  • 2:Windows/GUI应用程序
  • 3:Windows非GUI应用程序
  • 5:OS/2应用程序
  • 7:POSIX应用程序
这就是告诉Windows它是哪种类型的程序,因此使其能够像cmd一样做出不同的选择。 文档链接

3

撇开技术细节不谈(JaredPar做得非常好),如果您想将程序从Windows/GUI模式更改为Windows非GUI,您只需要进入项目设置并将下拉菜单从“Windows应用程序”更改为“控制台应用程序”即可。

enter image description here

您可以将窗口应用程序运行为控制台应用程序,这样它将给您期望的行为。(但请注意,现在如果双击程序图标,它将打开一个控制台窗口,该窗口将在程序打开时保持打开状态。)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接