Перенаправление вывода cmake в C ++ с помощью CreateProcessW - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь перенаправить вывод программы на C ++ на Windows с помощью CreateProcessW. Когда я пытаюсь использовать его для перенаправления вывода программ, таких как git, он работает нормально, но когда я делаю это с помощью cmake, вместо этого я получаю следующее сообщение на консоли:

Failed to create ConsoleBuf!

Мой код выглядит так:

void Process::Start(const std::string &args) const
{
    HANDLE g_hChildStd_OUT_Rd = nullptr;
    HANDLE g_hChildStd_OUT_Wr = nullptr;

    SECURITY_ATTRIBUTES saAttr;
    saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
    saAttr.bInheritHandle = TRUE;
    saAttr.lpSecurityDescriptor = nullptr;
    if (!::CreatePipe(&g_hChildStd_OUT_Rd, &g_hChildStd_OUT_Wr, &saAttr, 0)
            || !::SetHandleInformation(g_hChildStd_OUT_Rd, HANDLE_FLAG_INHERIT, 0))
    {
        throw std::runtime_error("Error while creating pipe: " + GetLastError());
    }
    PROCESS_INFORMATION piProcInfo;
    STARTUPINFOW siStartInfo = { sizeof(STARTUPINFOW) };
    ::ZeroMemory(&piProcInfo, sizeof(PROCESS_INFORMATION));
    ::ZeroMemory(&siStartInfo, sizeof(STARTUPINFO));
    siStartInfo.hStdError = g_hChildStd_OUT_Wr;
    siStartInfo.hStdOutput = g_hChildStd_OUT_Wr;
    siStartInfo.hStdInput = nullptr;
    siStartInfo.dwFlags |= STARTF_USESTDHANDLES;
    std::string fullPath = (std::filesystem::path(_path) / _name).string();
    std::string fullArgs = " " + args;
    if (!::CreateProcessW(std::wstring(fullPath.begin(), fullPath.end()).c_str(),
                        const_cast<LPWSTR>(std::wstring(fullArgs.begin(), fullArgs.end()).c_str(),
                        nullptr,
                        nullptr,
                        TRUE,
                        0,
                        nullptr,
                        std::wstring(_path.begin(), _path.end()).c_str(),
                        &siStartInfo,
                        &piProcInfo))
    {
        throw std::runtime_error("Failed to create new process: " + GetLastError());
    }
    ::CloseHandle(piProcInfo.hProcess);
    ::CloseHandle(piProcInfo.hThread);
    DWORD dwRead;
    TCHAR chBuf[BUFSIZ];
    BOOL success;
    do
    {
        success = ::ReadFile(g_hChildStd_OUT_Rd, chBuf, BUFSIZ, &dwRead, nullptr);
        if (success && dwRead > 0)
            std::wcout << chBuf << std::endl;
    } while (!success || dwRead == 0);
}

Я попытался выполнить поиск в Google и обнаружил, что речь идет о реализации std :: cout, которая не обрабатывает должным образом символы Unicode, но я не уверен, как это исправить ?

1 Ответ

0 голосов
/ 19 июня 2020

Как сказал Брехт Сандерс, изменение значения dwCreationFlags с 0 на CREATE_NEW_CONSOLE решило проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...