MFC获取cmd指令输出
时间: 2024-09-06 22:06:28 浏览: 55
在MFC(Microsoft Foundation Classes)中获取命令提示符(cmd)指令的输出,可以通过启动一个子进程并重定向其输出到一个管道来实现。这样可以捕获到cmd执行后返回的数据。具体步骤大致如下:
1. 创建一个启动命令行进程的`STARTUPINFO`结构体。
2. 设置`STARTUPINFO`结构体中的`dwFlags`成员为`STARTF_USESTDHANDLES`,并且设置`hStdOutput`和`hStdError`为一个安全的管道句柄。
3. 创建一个安全的管道,将管道的读句柄和写句柄分别用于子进程的标准输出和标准错误输出。
4. 创建子进程,并将`STARTUPINFO`结构体的地址传递给`CreateProcess`函数。
5. 从管道中读取数据,这些数据就是cmd指令的输出。
下面是一个简单的代码示例:
```cpp
#include <windows.h>
#include <iostream>
int main() {
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
// 创建安全管道
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
HANDLE hReadPipe, hWritePipe;
if (!CreatePipe(&hReadPipe, &hWritePipe, &sa, 0)) {
std::cerr << "CreatePipe failed" << std::endl;
return 1;
}
// 设置STARTUPINFO,重定向标准输出到管道
si.hStdOutput = hWritePipe;
si.hStdError = hWritePipe;
si.dwFlags |= STARTF_USESTDHANDLES;
// 启动cmd进程
if (!CreateProcess(NULL, // 不使用模块名
"cmd.exe", // 命令行
NULL, // 进程属性句柄不可继承
NULL, // 线程属性句柄不可继承
TRUE, // 句柄继承选项
0, // 没有创建标志
NULL, // 使用父进程的环境块
NULL, // 使用父进程的起始目录
&si, // 指向STARTUPINFO结构
&pi) // 指向PROCESS_INFORMATION结构
) {
std::cerr << "CreateProcess failed (" << GetLastError() << ")." << std::endl;
return 1;
}
// 关闭写端句柄,防止泄漏
CloseHandle(hWritePipe);
// 读取管道数据
char buffer[1024];
DWORD bytesRead;
while (ReadFile(hReadPipe, buffer, 1024, &bytesRead, NULL)) {
if (bytesRead == 0) break; // 文件结束
std::cout << buffer; // 输出到控制台
}
// 等待子进程结束
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}
```
这段代码启动了一个cmd进程,并通过管道获取了其输出。需要注意的是,在实际使用中,你可能需要对获取到的输出进行适当的处理,比如删除多余的换行符或空格等。
阅读全文