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

最进在写一个程序,需要调用一个第三方的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这个变量里面。


  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在 LabVIEW 中调用 exe 文件,可以使用 System Exec.vi 来实现。System Exec.vi 可以执行指定的命令行程序,并将其输出结果返回给 LabVIEW。 下面是一个简单的例子,演示如何调用 exe 文件并获取输出: 1. 首先,在 Block Diagram 中拖入 System Exec.vi。可以在 Functions Palette 的 Programming -> Execution Control 中找到该 VI。 2. 将 System Exec.vi 拖入 Block Diagram 后,右键单击该 VI,选择 Edit Command Line String。 3. 在 Edit Command Line String 对话框中,输入要执行的命令行程序的路径及参数。例如,要执行名为 myapp.exe 的程序,并传递参数 "arg1" 和 "arg2",则可以输入以下命令: ``` "path/to/myapp.exe" arg1 arg2 ``` 需要注意的是,如果路径中包含空格或其他特殊字符,需要使用双引号将路径括起来。 4. 在 Edit Command Line String 对话框中,勾选 Capture Output,表示要捕获命令行程序的输出结果。 5. 点击 OK 按钮关闭 Edit Command Line String 对话框。 6. 在 System Exec.vi 的右侧,会出现一个输出端口 Output。将该端口连接到一个 String Indicator 上,就可以在 LabVIEW 前端界面中显示命令行程序的输出结果了。 需要注意的是,System Exec.vi 是一个同步执行的 VI,在执行完命令行程序之前,LabVIEW 会一直等待程序输出结果。如果命令行程序的输出结果比较长,可能会导致 LabVIEW 假死。因此,建议在执行 System Exec.vi ,设置一个适当的超间,以避免程序长间无响应。 希望能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值