1

我为 OpenCascade 修改了一个 MFC 示例,添加了一些功能(它是 HLR 示例)。该应用程序使用文档/视图架构,文档类完成大部分工作。

一些新功能不需要 GUI,因此程序在打开 GUI 之前退出,我通过exit(0)从 CDocument 专业化调用来执行此操作。

我的问题是,对于我们的工作流程,将从 Windows 命令行调用 MFC 应用程序。一旦它被调用,它就会将控制权返回给 shell,并在后台愉快地继续前进,无论它是否打开了 GUI。我需要应用程序做的是从命令行阻止,无论 GUI 是否打开。

我一直在阅读 CWinApp 和 CMDIFrameWnd,但如果您可以从命令行阻止您的应用程序,我不知道该怎么做。

4

3 回答 3

1

如果您使用链接器选项 /SUBSYSTEM:CONSOLE 将可执行文件设置为控制台应用程序,则命令行将阻塞,直到应用程序退出。请记住,控制台应用程序可以具有 Windows GUI。

设置链接器设置 /SUBSYSTEM:CONSOLE 确实有一个问题,如果您将其作为链接器设置,您将不得不将入口点调整为 main() 而不是 winmain。在以下线程中,有一些解决方法(感谢 Ulrich Eckhardt 提到入口点): Visual Studio 2012 C++ Standard Output

这种方法还有第二个负面因素。如果程序不是从控制台窗口运行的,应用程序将为您创建一个控制台窗口。这可能会使用户感到困惑。

于 2013-06-20T17:35:11.910 回答
0

你不能。EXE 被标记为控制台或 Windows 程序,如果它是 Windows 程序控制,则将其移交给 Windows 管理器,并且控制台将继续运行。

您最好的选择是创建一个小型控制台应用程序,该应用程序调用CreateProcess以启动 Windows 应用程序,然后简单地WaitForSingleObject在 hProcess 句柄上完成它。

有关为什么它不可能的更多技术信息,请访问此处的旧新事物博客:

http://blogs.msdn.com/b/oldnewthing/archive/2009/01/01/9259142.aspx

于 2013-06-20T16:58:55.983 回答
0

如果您想阻止 MFC 应用程序(或通常的窗口应用程序)并输出到控制台(您需要先 AttachConsole() 或 AllocConsole()),请在 InitInstance(或等效方法)中执行您的工作,等待让任何线程在 ExitInstance 中完成,然后使用“start /WAIT <your app> <your options>”从命令行运行您的程序。您不需要编写一个特殊的控制台应用程序来等待...... start 已经这样做了。

于 2020-09-30T20:58:35.600 回答