25 SetConsoleCP(CP_UTF8);
26 SetConsoleOutputCP(CP_UTF8);
27 SetEnvironmentVariableW(L
"ENABLE_CONSOLE", L
"1");
28 SetEnvironmentVariableW(L
"ENABLE_CP_UTF8", L
"1");
29 SetEnvironmentVariableW(L
"ENABLE_HANDLING_VIRTUAL_TERMINAL_PROCESSING", L
"1");
32 wchar_t pathBuffer[MAX_PATH];
33 if (!GetModuleFileNameW(
nullptr, pathBuffer, MAX_PATH)) {
34 std::cerr <<
"Unable to determine wrapper executable path: " << std::error_code(GetLastError(), std::system_category()) <<
'\n';
39 const auto path = std::wstring_view(pathBuffer);
40 const auto filenameStart = replace(path.rfind(L
'\\'), std::wstring_view::npos, 0);
41 const auto appendixStart = std::wstring_view(pathBuffer + filenameStart, path.size() - filenameStart).rfind(L
"-cli.exe");
42 if (appendixStart == std::wstring_view::npos) {
43 std::cerr <<
"Unable to determine main executable path: unexpected wrapper executable name\n";
46 std::wcscpy(pathBuffer + filenameStart + appendixStart, L
".exe");
49 auto commandLine = GetCommandLineW();
50 auto processInformation = PROCESS_INFORMATION();
51 auto startupInfo = STARTUPINFOW();
52 ZeroMemory(&startupInfo,
sizeof(startupInfo));
53 ZeroMemory(&processInformation,
sizeof(processInformation));
54 startupInfo.cb =
sizeof(startupInfo);
55 startupInfo.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
56 startupInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE);
57 startupInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
58 startupInfo.dwFlags |= STARTF_USESTDHANDLES;
61 auto res = CreateProcessW(pathBuffer,
66 CREATE_NEW_PROCESS_GROUP,
72 std::cerr <<
"Unable to launch main executable: " << std::error_code(GetLastError(), std::system_category()) <<
'\n';
73 std::wcerr << L
" - assumed path: " << pathBuffer << L
'\n';
74 std::wcerr << L
" - assumed command-line: " << commandLine << L
'\n';
79 auto exitCode = DWORD();
80 WaitForSingleObject(processInformation.hProcess, INFINITE);
81 GetExitCodeProcess(processInformation.hProcess, &exitCode);