vc++调用exe时,如何获取exe的输出信息
2016-11-28 18:23
1436 查看
最进在写一个程序,需要调用一个第三方的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!
具体我也懒得写了,给段自己的代码出来在这里,自己调试下就知道了。
[cpp] view
plain copy
print?
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这个变量里面。
了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!
具体我也懒得写了,给段自己的代码出来在这里,自己调试下就知道了。
[cpp] view
plain copy
print?
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++调用exe时,如何获取exe的输出信息
- vc++调用exe时,如何获取exe的输出信息(输出显示在IDE的输出中)
- vc++调用exe时,如何获取exe的输出信息
- Linux下的C程序如何调用系统命令,并获取系统的输出信息到C程序中
- GUI程序如何使用控制台输出调试信息[zz][MFC调用win32窗口显示调试信息,使用AllocConsole 函数 ]
- VC调用CMD命令通过控制台管道获取输出结果
- 在被调用方法中如何获取调用方的相关信息
- VC常用代码之输出调用出错信息
- Basic INFO: InstallShield中如何获取所调用Exe的返回值
- 通过分析exevc系统调用处理过程来理解Linux内核如何装载和启动一个可执行程序
- C#调用外部exe作为子窗体或UI? VC++如何实现呢呢?...札记plus
- win32调试工具原理OutputDebugString以及如何获取输出信息
- 如何获取某个动态链接库的版本信息,exe 版本信息
- linux下的shell命令的编写,以及java如何调用linux的shell命令(java如何获取linux上的网卡的ip信息)
- VC++ 中 try-catch-finally 语句 如何在获取正常信息是写一些操作语句
- 存储过程有输出参数,在c#中用nhibernate调用存储过程时,如何才能获取到一个结果集和这个输出参数呢?
- 如何获取Windows命令行参数信息(和Linux中的ps -ef的输出相似)
- C# 调用外部程序,并获取输出和错误信息
- VC++语言如何输出当前日期,如何获取当前日期
- VC常用代码之输出调用出错信息