使用管道重定向为什么不能得到控制台的输出?
SECURITY_ATTRIBUTES sa,sa2;
HANDLE hInputRead,hInputWrite;
HANDLE hOutputRead,hOutputWrite;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (!CreatePipe(&hOutputRead,&hOutputWrite,&sa,0))
{
printf("Error On CreatePipe1");
return 0;
}
sa2.nLength = sizeof(SECURITY_ATTRIBUTES);
sa2.lpSecurityDescriptor = NULL;
sa2.bInheritHandle = TRUE;
if (!CreatePipe(&hInputRead,&hInputWrite,&sa2,0))
{
printf("Error On CreatePipe2");
return 0;
}
STARTUPINFO si;
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
//使用标准柄和显示窗口
si.hStdError = hOutputWrite;
si.hStdOutput = hOutputWrite;
si.hStdInput = hInputRead;
si.wShowWindow = SW_SHOW;//隐藏控制台窗口
PROCESS_INFORMATION pi= {0};
BOOL fRet = CreateProcess(NULL,
"ping 127.0.0.1",NULL,FALSE,NULL,NULL,NULL,NULL,&si,&pi);
if (!fRet) {
g_bWait = FALSE;
::SendMessage((HWND)lpParam, WM_SETTEXT, 0, (LPARAM)"创建转换进程失败!");
return 0;
}
CloseHandle(hInputRead);
CloseHandle(hOutputWrite);
CString strInfo;
strInfo.Empty();
char buffer[4096] = {0};
DWORD bytesRead;
while (true)
{
if(ReadFile(hOutputRead,buffer,4095,&bytesRead,NULL) == NULL)
{
break;
}
strInfo += buffer;
printf(buffer);// 输出
Sleep(100);
}
CloseHandle(hInputWrite);
CloseHandle(hOutputRead);
::SendMessage((HWND)lpParam, WM_SETTEXT, 0, (LPARAM)strInfo.GetBuffer(0));
WaitForSingleObject(pi.hProcess, INFINITE);
//检查执行结果
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
完全照抄网络上面的代码,但是读不到窗口输出信息,谁知道这段代码那里有问题.
HANDLE hInputRead,hInputWrite;
HANDLE hOutputRead,hOutputWrite;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (!CreatePipe(&hOutputRead,&hOutputWrite,&sa,0))
{
printf("Error On CreatePipe1");
return 0;
}
sa2.nLength = sizeof(SECURITY_ATTRIBUTES);
sa2.lpSecurityDescriptor = NULL;
sa2.bInheritHandle = TRUE;
if (!CreatePipe(&hInputRead,&hInputWrite,&sa2,0))
{
printf("Error On CreatePipe2");
return 0;
}
STARTUPINFO si;
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
//使用标准柄和显示窗口
si.hStdError = hOutputWrite;
si.hStdOutput = hOutputWrite;
si.hStdInput = hInputRead;
si.wShowWindow = SW_SHOW;//隐藏控制台窗口
PROCESS_INFORMATION pi= {0};
BOOL fRet = CreateProcess(NULL,
"ping 127.0.0.1",NULL,FALSE,NULL,NULL,NULL,NULL,&si,&pi);
if (!fRet) {
g_bWait = FALSE;
::SendMessage((HWND)lpParam, WM_SETTEXT, 0, (LPARAM)"创建转换进程失败!");
return 0;
}
CloseHandle(hInputRead);
CloseHandle(hOutputWrite);
CString strInfo;
strInfo.Empty();
char buffer[4096] = {0};
DWORD bytesRead;
while (true)
{
if(ReadFile(hOutputRead,buffer,4095,&bytesRead,NULL) == NULL)
{
break;
}
strInfo += buffer;
printf(buffer);// 输出
Sleep(100);
}
CloseHandle(hInputWrite);
CloseHandle(hOutputRead);
::SendMessage((HWND)lpParam, WM_SETTEXT, 0, (LPARAM)strInfo.GetBuffer(0));
WaitForSingleObject(pi.hProcess, INFINITE);
//检查执行结果
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
完全照抄网络上面的代码,但是读不到窗口输出信息,谁知道这段代码那里有问题.
...全文
相关推荐
匿名管道实现控制台重定向
在本例中,“匿名管道实现控制台重定向”是指将控制台输出(如命令行程序的打印信息)通过匿名管道导向到其他地方,例如另一个进程或文件。
VC++使用管道重定向进程输入输出(附源码)
VC++常用功能封装代码一系列文章与源码 (欢迎订阅,持续更新...) https://blog.csdn.net/kaizi318/article/details/108846326 源代码demo已上传到百度网盘:永久生效 代码实现了调用控制台程序,并使用管道重定向解析控制台程序输出,实现与控制台程序内部交互! 使用场景:如我们调用ffmpeg.exe进行一些音视频转换工作,(早期以此播放器都这么干), 这样我们不用去编译ffmpeg库,只要知道这个工具怎么使用,然后通过程序调用起来,然...
MFC控制台指令的重定向输出到文件方法
前一篇文章讲过如何隐藏控制台窗口,并把结果返回。但是控制台有个输出重定向输出到文件功能,这个在createprocess中是不支持的。因此那个函数改进如下 TCHAR strLog[1024]={0}; CString strCmp =_T("test.exe abc>abc.h"); RunCMD(strLog,strCmp.GetBuffer(),TRUE);//这个是用
cmd中的重定向输出,管道
### CMD中的重定向输出与管道操作详解在日常的编程工作中,特别是在Windows环境下进行开发时,熟练掌握CMD命令行工具的使用技巧对于提高工作效率是非常有帮助的。
Linux操作之输入输出重定向和管道
- **输出重定向**:例如,使用`>`操作符可以将命令的输出重定向到文件中,覆盖原有文件内容。


