Я пытаюсь перенаправить вывод программы на 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, но я не уверен, как это исправить ?