我修改了OpenCascade的MFC示例,添加了一些功能(这是HLR示例)。该应用程序使用文档/视图架构,文档类完成大部分工作。
某些新功能不需要GUI,因此程序在GUI打开之前退出,我通过从CDocument专业化调用exit(0)
来执行。
我的问题是,对于我们的工作流程,将从Windows命令行调用MFC应用程序。一旦被调用,它就会将控制权返回给shell,并在后台快速继续,无论是否打开GUI。我需要应用程序做的是阻止命令行,GUI是否打开。
我一直在阅读CWinApp和CMDIFrameWnd,但如果您可以从命令行进行应用程序阻止,我无法弄清楚如何执行此操作。
答案 0 :(得分:1)
如果使用链接器选项/ SUBSYSTEM:CONSOLE将可执行文件设置为控制台应用程序,命令行将阻塞,直到应用程序退出。请记住,控制台应用程序可以具有Windows GUI。
设置链接器设置/ SUBSYSTEM:CONSOLE确实有一个问题,如果你这样做作为链接器设置,你必须将入口点调整为main()而不是winmain。在下面的主题中有一些解决方法(感谢Ulrich Eckhardt提到了切入点): Visual Studio 2012 C++ Standard Output
这种方法还有第二个不利因素。如果程序未从控制台窗口运行,则应用程序将为您创建控制台窗口。这可能会使用户感到困惑。
答案 1 :(得分:0)
你做不到。 EXE被标记为控制台或Windows程序,如果它是Windows程序控件移交给Windows管理器,控制台将继续运行。
最好的办法是创建一个小型控制台应用程序,调用CreateProcess
启动Windows应用程序,然后在hProcess句柄上单击WaitForSingleObject
即可完成。
有关不可能的原因的更多技术信息可在The Old New Thing博客上找到:
http://blogs.msdn.com/b/oldnewthing/archive/2009/01/01/9259142.aspx
答案 2 :(得分:0)
如果要阻止MFC应用程序(通常是窗口应用程序)并输出到控制台(首先需要AttachConsole()或AllocConsole()),请在InitInstance(或等效方法)中进行工作),等待ExitInstance中的所有线程完成,然后使用“ start / WAIT <您的应用程序> <您的选项>”从命令行运行您的程序。您不需要编写特殊的控制台应用程序即可等待...启动已经完成。