下你所需,载你所想!
汇集开发技术源码资料

C++重定向输入输出将控制台程序在窗口中运行

:282.472KB :1 :2019-12-20 16:32:55

部分简介

//定义句柄: 构成stdin管道的两端句柄
HANDLE hStdInRead; //子进程用的stdin的读入端
HANDLE hStdInWrite; //主程序用的stdin的读入端

//定义句柄: 构成stdout管道的两端句柄
HANDLE hStdOutRead; ///主程序用的stdout的读入端
HANDLE hStdOutWrite; ///子进程用的stdout的写入端

//定义一个用于产生子进程的STARTUPINFO结构体 (定义见CreateProcess,函数说明)
STARTUPINFO siStartInfo;
//定义一个用于产生子进程的PROCESS_INFORMATION结构体 (定义见CreateProcess,函数说明)
PROCESS_INFORMATION piProcInfo;

void main()
{
//产生一个用于stdin的管道,得到两个HANDLE: hStdInRead用于子进程读出数据,hStdInWrite用于主程序写入数据
//其中saAttr是一个STARTUPINFO结构体,定义见CreatePipe函数说明
SECURITY_ATTRIBUTES saAttr = {0};
saAttr.nLength = sizeof(saAttr);
saAttr.bInheritHandle = TRUE;
if (!CreatePipe(&hStdInRead, &hStdInWrite, &saAttr, 0))
return;

//产生一个用于stdout的管道,得到两个HANDLE: hStdInRead用于主程序读出数据,hStdInWrite用于子程序写入数据
if (!CreatePipe(&hStdOutRead, &hStdOutWrite, &saAttr, 0))
return;

//对STARTUPINFO结构体赋值,对stdin,stdout的Handle设置为刚才得到的管道HANDLE
ZeroMemory(&siStartInfo, sizeof(STARTUPINFO));
siStartInfo.cb = sizeof(STARTUPINFO);
siStartInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; //允许设置showwindow和设置新进程的输入输出句柄参数
siStartInfo.hStdOutput = hStdOutWrite; //意思是:子进程的stdout输出到hStdOutWrite
siStartInfo.hStdError = hStdOutWrite; //意思是:子进程的stderr输出到hStdErrWrite
siStartInfo.hStdInput = hStdInRead;

//CreateProcess()中使用了CREATE_NEW_CONSOLE后, 可以去掉下面这两句注释
//siStartInfo.wShowWindow = SW_SHOW;
//siStartInfo.lpTitle = "新进程标题";

TCHAR CommandLine[] = _T("/c ping 127.0.0.1"); //
// 产生子进程,具体参数说明见CreateProcess函数
BOOL bSuccess = CreateProcess("C:\\Windows\\System32\\cmd.exe",
CommandLine, // 子进程的命令行
NULL, // process security attributes
NULL, // primary thread security attributes
TRUE, // handles are inherited
CREATE_NO_WINDOW, // creation flags 如果想新进程显示窗口, 可以设置CREATE_NEW_CONSOLE
NULL, // use parent's environment
NULL, // use parent's current directory
&siStartInfo, // STARTUPINFO pointer
&piProcInfo); // receives PROCESS_INFORMATION

//如果失败,退出
if (!bSuccess) return;

//然后,就可以读写管道了
DLL命令预览管道数据 (输出管道, 0, 0, 0, 长度, 0)
.如果真 (长度 > 0)
文本 = 取空白文本 (1024)
DLL命令读对象数据 (输出管道, 文本, 1023, 长度, 0)
输出编辑框.内容 = 取文本左边 (文本, 长度)
.如果真结束
DLL命令取进程退出代码 (进程信息.进程句柄, 长度)
.如果真 (长度 ≠ #STILL_ACTIVE)
DLL命令关闭内核对象 (输入管道)
DLL命令关闭内核对象 (输出管道)
进程成功 = 假
API信息框 (_启动窗口.取窗口句柄 (), _启动窗口.标题 + “ 进程已退出,返回值为:” + 到文本 (长度))

C++重定向输入输出将控制台程序在窗口中运行

热门推荐

相关文章