vc++调用exe时,如何获取exe的输出信息

原创 2012年04月15日 10:40:03

最进在写一个程序,需要调用一个第三方的console程序,并获取其处理的结果,调用exe的方法有很多,可是如何调用

了exe然后取到exe的输出信息就是个问题了,试了很多函数,好像都实现不了。

百度了一下,找到篇文章:http://social.microsoft.com/Forums/id-ID/visualcpluszhchs/thread/70fc59b7-6e2d-44e2-9d47-b8c38f49df52

顿时明了了,使用匿名管道把输出重定向就能达到目标了。

下面是查到的一篇介绍如何使用的文章:

VC++在多进程通讯中有一种很好的方法就是使用管道技术。
对于很多的初学者来说,不知道IDE的具体原理是什么,作者也是一样,为此迷惑了很多年,也最近才弄清楚

IDE是如何集成了其他的命令行软件的,比如VC中的cc.exe,cl.exe等Devc++中的gcc,WinTC中集成的tc2.0等。

看起来相当的神秘,其实很简单的。这些IDE就只使用了两种比较核心的技术:一是创建一个进程,比如创建一

个cl.exe的进程;二是利用管道与子进程通信,获取其运行结果,把过程输出和结果输出显示在IDE的输出中!

IDE提供的其他的就是一个代码的编辑环境而已!当然,IDE还做了一件幕后的工作就是根据工程的文件组织生

成了一个MAKEFILE文件。所以,只要你熟悉这两种技术,你也可以编写出一个IDE!

具体我也懒得写了,给段自己的代码出来在这里,自己调试下就知道了。

CString strCmd = "hello.exe";//cmd命令
SECURITY_ATTRIBUTES sa;
HANDLE hRead,hWrite;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL; //使用系统默认的安全描述符
sa.bInheritHandle = TRUE; //创建的进程继承句柄

if (!CreatePipe(&hRead,&hWrite,&sa,0)) //创建匿名管道
{
	MessageBox("CreatePipe Failed!","提示",MB_OK | MB_ICONWARNING);
	return;
}

STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory(&si,sizeof(STARTUPINFO));

si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite;
si.hStdOutput = hWrite; //新创建进程的标准输出连在写管道一端
si.wShowWindow = SW_HIDE; //隐藏窗口
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;


char cmdline[200];
sprintf(cmdline,"%s",strCmd);

if (!CreateProcess(NULL,cmdline,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi)) //创建子进程
{
	MessageBox("CreateProcess Failed!","提示",MB_OK | MB_ICONWARNING);
	return;
}
CloseHandle(hWrite); //关闭管道句柄

char buffer[4096] = {0};
CString strOutput;
DWORD bytesRead;

while (true)
{
	if (ReadFile(hRead,buffer,4095,&bytesRead,NULL) == NULL) //读取管道
	break;
	strOutput += buffer;
	UpdateWindow();
	Sleep(100);
}
CloseHandle(hRead);

这样exe的输出信息都存在了strOutput这个变量里面。


VC中调用并获取外部程序输出

VC上调用外部程序的方法大家应该很熟悉,比如ShellExecute,CreateProcess。 例子: system("D://adb.exe devices >c://temp.txt");...
  • zwlhoho
  • zwlhoho
  • 2015年11月13日 15:47
  • 1663

vc++调用exe时,如何获取exe的输出信息

最进在写一个程序,需要调用一个第三方的console程序,并获取其处理的结果,调用exe的方法有很多,可是如何调用 了exe然后取到exe的输出信息就是个问题了,试了很多函数,好像都实现不了。 ...
  • AMDS123
  • AMDS123
  • 2016年11月28日 18:23
  • 6315

MFC运行外部exe并得到返回值

unsigned long Result; CString strWorkPath = szWorkPath; CString strRes; strWorkPath += _T("\\netcfg...
  • mdcire
  • mdcire
  • 2016年12月19日 17:27
  • 631

MFC执行CMD命令并获得其返回信息源代码

MFC执行CMD命令并获得其返回信息源代码,MFC中CString转TCHAR格式源代码,实用小函数,大家可以直接拿去用。...
  • u010394032
  • u010394032
  • 2014年04月15日 16:22
  • 2924

vc++调用exe时,如何获取exe的输出信息(输出显示在IDE的输出中)

vc++调用exe时,如何获取exe的输出信息 最进在写一个程序,需要调用一个第三方的console程序,并获取其处理的结果,调用exe的方法有很多,可是如何调用 了exe然后取到exe的...
  • haiross
  • haiross
  • 2015年04月23日 09:47
  • 1796

C# 调用外部程序,并获取输出和错误信息

public void exec(string exePath, string parameters) { System.Diagnostics.Process...
  • yinxing2008
  • yinxing2008
  • 2014年01月27日 22:40
  • 1664

vc++调用exe时,如何获取exe的输出信息

最进在写一个程序,需要调用一个第三方的console程序,并获取其处理的结果,调用exe的方法有很多,可是如何调用 了exe然后取到exe的输出信息就是个问题了,试了很多函数,好像都实现不了。 百...
  • bl1988530
  • bl1988530
  • 2012年04月15日 10:40
  • 3773

在VC下执行DOS命令并得到返回结果

 改变DOS程序的标准输出,用一个管道的写端口替换他,然后windows程序从管道的读端口读出来。 下面这个示例的函数可以把给定的DOS命令执行一遍,并把DOS下的输出内容记录在buffer中。同时示...
  • Amy_1007
  • Amy_1007
  • 2011年06月23日 14:57
  • 7506

VC++调用外部exe

【原文】http://blog.csdn.net/archielau/article/details/7879718 主要有三种方式:
  • u012234115
  • u012234115
  • 2014年06月27日 11:28
  • 1297

Qt调用外部exe并同步显示输出

之前做过一个用C#同步调用exe并显示输出的程序,最近又想用一个Qt做一下这个工作;相比之下,Qt确实要简单许多。 我参考http://blog.sina.com.cn/s/blog_7243586a...
  • u012348774
  • u012348774
  • 2016年01月08日 09:13
  • 1979
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:vc++调用exe时,如何获取exe的输出信息
举报原因:
原因补充:

(最多只允许输入30个字)