@@ -113,23 +113,33 @@ int Platform::defaultBackEnd() {
113113}
114114
115115#if (BOOST_OS_WINDOWS)
116+ std::unique_ptr<FILE, decltype (&fclose)> Platform::stdErrStream{nullptr , fclose};
117+ std::unique_ptr<HANDLE, decltype (&CloseHandle)> Platform::stdOutHandle{nullptr , CloseHandle};
116118int Platform::stderr_fd;
117119
118120void Platform::initWindowsConsole () {
119- if (AttachConsole (ATTACH_PARENT_PROCESS) == 0 || fileno (stdout) == -2 || fileno (stderr) == -2 ) {
121+ if (int res = AttachConsole (ATTACH_PARENT_PROCESS) == 0 && ( fileno (stdout) == -2 || fileno (stderr) == -2 ) ) {
120122 auto ptr = stdErrStream.get ();
121123 freopen_s (&ptr, " NUL" , " w" , stderr);
122124 }
123125 else {
124- freopen_s ((FILE**)stdout, " CONOUT$" , " w" , stdout);
125126 freopen_s ((FILE**)stderr, " CONOUT$" , " w" , stderr);
126- std::ios::sync_with_stdio (true );
127- std::setvbuf (stdout, nullptr , _IONBF, 0 );
128- std::setvbuf (stderr, nullptr , _IONBF, 0 );
129- std::cout.clear ();
130- std::cerr.clear ();
131- std::wcout.clear ();
132- std::wcerr.clear ();
127+ freopen_s ((FILE**)stdout, " CONOUT$" , " w" , stdout);
128+ HANDLE hStdout = CreateFile (
129+ " CONOUT$" , GENERIC_READ | GENERIC_WRITE,
130+ FILE_SHARE_READ | FILE_SHARE_WRITE, NULL ,
131+ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
132+ );
133+ if (hStdout == INVALID_HANDLE_VALUE) {
134+ std::fprintf (stderr, " Unable to get a handle to the stdout console. Error=%u" , GetLastError ());
135+ }
136+ else {
137+ stdOutHandle.reset (&hStdout);
138+ SetStdHandle (STD_OUTPUT_HANDLE, *stdOutHandle);
139+ std::setvbuf (stdout, nullptr , _IONBF, 0 );
140+ std::cout.clear ();
141+ std::wcout.clear ();
142+ }
133143 }
134144 stderr_fd = fileno (stderr);
135145}
0 commit comments