【问题标题】:How can I get an MFC application to block from the command line?如何从命令行阻止 MFC 应用程序?
【发布时间】:2013-06-17 14:05:32
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我会把它变成一个带有 /SUBSYSTEM:CONSOLE 链接器设置的控制台应用程序。
  • 我认为这也会隐式更改 main() 的入口点,因此您需要在链接器设置中添加 /entry:WinMain 或类似的东西。
  • 我有几个选项可以解决这个问题:stackoverflow.com/questions/13840942/…
  • 感谢有关作为控制台应用程序编译/运行的建议。我们只是要从批处理文件中调用应用程序,该文件会一直阻塞,直到应用程序完成。

标签: c++ windows mfc opencascade


【解决方案1】:

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

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

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

【讨论】:

  • 感谢所有关于作为控制台应用程序编译/运行的建议。我不担心混淆用户,但我担心打印到控制台的一大堆 printf 调试语句会减慢应用程序的速度。你们都知道这会不会有问题?
  • 你不能在你的发布版本中禁用这些或将它们重定向到一个文件吗?
  • 我们有这么多的 printf 调试有点荒谬,但是我们有 这么多 (其中一些是由分包商提供的),我们只是使用批处理文件解决方案。纯粹是节省成本的举措。
  • 所以在调用 Windows 应用程序的常规批处理文件中,应用程序会等到它关闭吗?或者是否有一些选择可以让它工作。另请发布您的批处理解决方案作为答案。我会赞成。
  • 谢谢drescherjm。我本来打算把它作为答案发布,但是 stackoverflow 提示你回答你自己的问题让我感到有点羞愧。
【解决方案2】:

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

最好的办法是创建一个小型控制台应用程序,调用 CreateProcess 来启动 Windows 应用程序,然后只需在 hProcess 句柄上调用 WaitForSingleObject 即可完成。

有关为什么它不可能的更多技术信息,请访问此处的 The Old New Thing 博客:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-05-10
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      • 2012-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多