Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从控制台启动可执行文件并使用Qt读取输出_C++_Qt_Winapi_Windows Ce_Qprocess - Fatal编程技术网

C++ 如何从控制台启动可执行文件并使用Qt读取输出

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状态 尝试此类(省略了一些

我想在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状态

尝试此类(省略了一些错误检查)


你知道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();