控制控制台应用程序






4.17/5 (9投票s)
运行控制台应用程序并控制/使用它们的输入/输出流
控制台窗口和应用程序输出
在一个“简单”项目中,我发现捕获控制台窗口的输出到应用程序控件中的任务非常繁琐。 额外的困难在于隐藏控制台窗口,从而隐藏应用程序。
正如预期的那样,事情并不像将输出重定向到文件并重新读取该文件那么简单。
因此,我开始为这项任务创建一个包装类,结果证明它比最初想象的要困难得多。 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
类以两种方式
- 使用构造函数方法
CSpawn::CSpawn(CString& exe, CSpawnConsumer* sc)
- 或者创建一个
CSpawn
变量并调用Execute(CString& exe, CSpawnConsumer* sc)
默认实现将通过解析 ComSpec 环境变量(通常是 CMD.EXE 或 COMMAND.EXE)来生成可执行文件,并将参数传递给给定的应用程序。
您可以通过调用 SendInput()
向正在运行的应用程序提供用户输入。
示例
包含的示例项目显示了一个简单的编辑控件,其中输入的任何文本都传递给标准命令解释器,并将结果返回到同一个编辑控件中。
它展示了如何以最常见的方式与 CSpawn
类进行接口。
兼容性
CSpawn
在 Windows 2000 和 Windows XP 下使用 Unicode 和 MBCS(都包含在演示项目中)使用 Visual C++ 6.0 SP5 和 MFC 6 进行测试。 它未在 .NET 和 MFC 7 上进行测试。
修订历史
2002年6月19日 - 初始修订版