65.9K
CodeProject 正在变化。 阅读更多。
Home

控制控制台应用程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.17/5 (9投票s)

2002年2月5日

Ms-PL

2分钟阅读

viewsIcon

177422

downloadIcon

3078

运行控制台应用程序并控制/使用它们的输入/输出流

控制台窗口和应用程序输出

在一个“简单”项目中,我发现捕获控制台窗口的输出到应用程序控件中的任务非常繁琐。 额外的困难在于隐藏控制台窗口,从而隐藏应用程序。

正如预期的那样,事情并不像将输出重定向到文件并重新读取该文件那么简单。

因此,我开始为这项任务创建一个包装类,结果证明它比最初想象的要困难得多。 MSDN 中提供的示例没有提及最重要的内容,并且提出的问题比解决的问题更多。

在各种代码站点上搜索提供了一些关于该主题的更多信息。 最后,我能够组装一个可用的解决方案。(尽管还有一些小的愿望未实现)

CSpawn 类

这个类有一个非常简单的接口。 一个构造函数,一个执行函数,一个输出函数,最后是一个测试以查看它是否仍然处于活动状态。 执行函数和输出函数有多种形式可用。

为了获得反馈,您必须从 CSpawnConsumer 类派生一个类并重载 Consume() 函数。

通常看起来是这样的

class CSpawnConsumer1 : public CSpawnConsumer
{
public:
    explicit CSpawnConsumer1(CMyEdit* pEdit)
                                   : m_pEdit(pEdit){}
    void Consume(TCHAR* p, DWORD dw)
    {
        m_pEdit->DoWhateverWithTheInput(p);
    }

private:
    CMyEdit* m_pEdit;
};

这个类是从读取控制台窗口输出的线程调用的。

您可以使用 CSpawn 类以两种方式

  1. 使用构造函数方法 CSpawn::CSpawn(CString& exe, CSpawnConsumer* sc)
  2. 或者创建一个 CSpawn 变量并调用 Execute(CString& exe, CSpawnConsumer* sc)

默认实现将通过解析 ComSpec 环境变量(通常是 CMD.EXECOMMAND.EXE)来生成可执行文件,并将参数传递给给定的应用程序。

您可以通过调用 SendInput() 向正在运行的应用程序提供用户输入。

示例

包含的示例项目显示了一个简单的编辑控件,其中输入的任何文本都传递给标准命令解释器,并将结果返回到同一个编辑控件中。

它展示了如何以最常见的方式与 CSpawn 类进行接口。

兼容性

CSpawn 在 Windows 2000 和 Windows XP 下使用 Unicode 和 MBCS(都包含在演示项目中)使用 Visual C++ 6.0 SP5 和 MFC 6 进行测试。 它未在 .NET 和 MFC 7 上进行测试。

修订历史

2002年6月19日 - 初始修订版

© . All rights reserved.