C++ 如何从控制台启动可执行文件并使用Qt读取输出
我想在cmd上从Qt启动一个可执行文件,然后读取它的输出 我是否必须为此使用WinAPI;例如CreateProcess() 我使用了QProcess,它在Windows 10上运行良好,但在Windows CE上不起作用。下面是在桌面上工作的示例代码C++ 如何从控制台启动可执行文件并使用Qt读取输出,c++,qt,winapi,windows-ce,qprocess,C++,Qt,Winapi,Windows Ce,Qprocess,我想在cmd上从Qt启动一个可执行文件,然后读取它的输出 我是否必须为此使用WinAPI;例如CreateProcess() 我使用了QProcess,它在Windows 10上运行良好,但在Windows CE上不起作用。下面是在桌面上工作的示例代码 QProcess p; p.start(path, arg); p.waitForFinished(); std::string output = p.readAll(); QT 4.8状态 尝试此类(省略了一些
QProcess p;
p.start(path, arg);
p.waitForFinished();
std::string output = p.readAll();
QT 4.8状态
尝试此类(省略了一些错误检查)
你知道WinAPI是否可以做到这一点吗?QT 5.13文档中也没有这个注释。你不知道WinAPI,值得自己尝试一下。我确实在Qt文档中看到,检查每个被调用API的返回值是值得的,使用waitForStarted()也是值得的
Note: On Windows CE and Symbian, reading and writing to a process is not supported.
#pragma once
#include <windows.h>
#include <thread>
#include <iostream>
#include <sstream>
#define BUFSIZE 4096
class m_Process
{
public:
m_Process();
~m_Process();
BOOL start(char* path, char* cmd);
void waitForFinished();
std::string readAll();
private:
HANDLE hProcess;
HANDLE hRead;
HANDLE hWrite;
std::ostringstream stream;
friend void ReadFromPipe(m_Process* Process);
};
void ReadFromPipe(m_Process* Process)
{
DWORD dwRead;
CHAR chBuf[BUFSIZE];
BOOL bSuccess = FALSE;
Process->stream.clear();
for (;;)
{
bSuccess = ReadFile(Process->hRead, chBuf, BUFSIZE-1, &dwRead, NULL);
if (!bSuccess || dwRead == 0) break;
chBuf[dwRead] = 0;
Process->stream << chBuf;
}
}
m_Process::m_Process()
{
hProcess = NULL;
SECURITY_ATTRIBUTES saAttr;
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
saAttr.bInheritHandle = TRUE;
saAttr.lpSecurityDescriptor = NULL;
CreatePipe(&hRead, &hWrite, &saAttr, 0);
SetHandleInformation(hRead, HANDLE_FLAG_INHERIT, 0);
}
m_Process::~m_Process()
{
if(hRead)
CloseHandle(hRead);
if (hWrite)
CloseHandle(hWrite);
CloseHandle(hProcess);
stream.clear();
}
BOOL m_Process::start(char * path, char * cmd)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
si.dwFlags = STARTF_USESTDHANDLES;
si.wShowWindow = TRUE;
si.hStdOutput = hWrite;
si.hStdError = hWrite;
BOOL ret = CreateProcess(path, cmd, NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi);
CloseHandle(hWrite);
hWrite = NULL;
std::thread t(&ReadFromPipe,this);
t.join();
if (ret)
hProcess = pi.hProcess;
return ret;
}
void m_Process::waitForFinished()
{
if (hProcess)
WaitForSingleObject(hProcess, INFINITE);
}
std::string m_Process::readAll()
{
return stream.str();
}
m_Process p;
p.start(path, arg);
p.waitForFinished();
std::string output = p.readAll();