用c++代码实现通过cmd 运行exe且获取cmd窗口的log存在CString中
时间: 2024-11-27 12:18:23 浏览: 6
在C++中,你可以使用`CreateProcess`函数来通过命令行运行一个.exe文件,并通过管道(pipe)捕获其输出。这里是一个简单的示例,它创建一个新的进程并读取CMD窗口的日志到`CString`变量中:
```cpp
#include <windows.h>
#include <iostream>
#include <atlstr.h>
std::string GetCmdOutput(const std::wstring& command) {
STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};
// 设置STARTUPINFO结构
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
// 创建管道句柄
SECURITY_ATTRIBUTES saAttr = {0};
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
saAttr.bInheritHandle = TRUE;
HANDLE hReadPipe, hWritePipe;
if (!CreatePipe(&hReadPipe, &hWritePipe, &saAttr, 0)) {
// 处理错误
return "";
}
// 设置处理程序信息
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
if (!CreateProcess(NULL, // 父进程
L"cmd /c " + command, // 命令行
NULL, // 父进程安全属性
NULL, // 子进程安全属性
TRUE, // 是否继承父进程的句柄
DETACHED_PROCESS, // 进程模式
NULL, // 输入缓冲区
hWritePipe, // 输出缓冲区
&si, // 启动信息
&pi)) {
// 处理错误
CloseHandle(hReadPipe);
CloseHandle(hWritePipe);
return "";
}
// 关闭写端管道句柄
CloseHandle(hWritePipe);
DWORD bytesRead;
char buffer[4096];
std::vector<char> output;
do {
if (!PeekNamedPipe(hReadPipe, NULL, 0, NULL, &bytesRead, NULL)) {
break;
}
if (bytesRead > 0) {
if (!ReadFile(hReadPipe, buffer, bytesRead, &bytesRead, NULL)) {
break;
}
output.insert(output.end(), buffer, buffer + bytesRead);
}
} while (!GetLastError() == ERROR_BROKEN_PIPE);
// 关闭读端管道句柄
CloseHandle(hReadPipe);
// 将输出转换为宽字符串
std::wstring wide_output = AtlUnicodeToWide(output.begin(), output.end());
// 将宽字符串转换回原始格式(这里假设你要的是CString)
CString cmdLog(wide_output.c_str());
return cmdLog.GetBuffer();
}
int main() {
std::wcout << "Running cmd with output: " << GetCmdOutput(L"C:\\path\\to\\your\\exe.exe") << std::endl;
// ...其他处理或返回cmd log内容...
return 0;
}
```
注意:这个例子需要链接ATL库,并且可能会因为权限问题无法完全捕获所有输出。此外,对于较长的输出,你可能需要调整读取和缓冲的方式。
阅读全文