HANDLE hRead, hWrite; SECURITY_ATTRIBUTES sa; sa.nLength = sizeof(sa); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; CreatePipe(&hRead, &hWrite, &sa, 0); // 创建子进程并重定向标准输出流 STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); si.dwFlags = STARTF_USESTDHANDLES; si.hStdOutput = hWrite; CreateProcess(NULL, "another_program.exe", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi); // 从管道中读取数据并显示在当前窗口中 char buffer[1024]; DWORD bytesRead; while (ReadFile(hRead, buffer, sizeof(buffer), &bytesRead, NULL) && bytesRead > 0) { buffer[bytesRead] = '\0'; printf("%s", buffer);解释一下这段程序
时间: 2023-06-20 11:09:37 浏览: 288
MFC执行DOS去掉黑框取得DOS命令结果
这段程序主要实现了在当前窗口中显示另一个程序("another_program.exe")的标准输出流数据。具体步骤如下:
1. 创建管道:使用 CreatePipe 函数创建一个匿名管道,返回两个句柄 hRead 和 hWrite,分别用于读取和写入管道数据。
2. 创建子进程并重定向标准输出流:使用 CreateProcess 函数创建一个新的进程,并将其标准输出流(stdout)重定向到管道的写入端 hWrite 上。这样,当进程向标准输出流写入数据时,数据会被发送到管道中。
3. 读取管道数据并显示在当前窗口中:使用 ReadFile 函数从管道的读取端 hRead 中读取数据,最多读取 sizeof(buffer) 个字节,将读取的数据存储在 buffer 缓冲区中。如果读取成功且读取的字节数大于 0,则在当前窗口中打印 buffer 中的数据。循环执行,直到读取完所有数据或出现错误。
其中,为了使子进程的标准输出流能够被重定向到管道中,需要设置 STARTUPINFO 结构体中的 dwFlags 参数为 STARTF_USESTDHANDLES,并将 hStdOutput 成员设置为 hWrite 句柄。同时,为了保证管道能够被子进程正确地继承,需要将 sa 结构体中的 bInheritHandle 参数设置为 TRUE。
阅读全文