diff --git a/source/core/sxcore.h b/source/core/sxcore.h
index 3ca24f8dcc1d93b3f4fc6235229b43902c97531a..c9a84844274bdc2a7f83ee82d42e258775a2b8d8 100644
--- a/source/core/sxcore.h
+++ b/source/core/sxcore.h
@@ -484,22 +484,45 @@ class COutPtr
 		m_fOut = ::_fdopen(_dup(hOut), "a+");
 		::setvbuf(m_fOut, NULL, _IONBF, 0);
 
-		m_fStdout = *stdout;
-		m_fStderr = *stderr;
-
-		*stdout = *m_fOut;
-		*stderr = *m_fOut;
+#ifdef _MSC_VER
+		if(_fileno(stdout) < 0)
+		{
+			char szPipename[255];
+			HANDLE hPipe = NULL;
+			{
+				sprintf(szPipename, "\\\\.\\pipe\\SkyXEngineConsoleStdout-%u-%u", GetCurrentProcessId(), GetCurrentThreadId());
+				hPipe = CreateNamedPipe(szPipename, PIPE_ACCESS_DUPLEX, PIPE_NOWAIT | PIPE_READMODE_BYTE, PIPE_UNLIMITED_INSTANCES, 0, 0, 0, NULL);
+				freopen(szPipename, "w", stdout);
+				_dup2(_fileno(m_fOut), _fileno(stdout));
+				CloseHandle(hPipe);
+			}
+
+			{
+				sprintf(szPipename, "\\\\.\\pipe\\SkyXEngineConsoleStderr-%u-%u", GetCurrentProcessId(), GetCurrentThreadId());
+				hPipe = CreateNamedPipe(szPipename, PIPE_ACCESS_DUPLEX, PIPE_NOWAIT | PIPE_READMODE_BYTE, PIPE_UNLIMITED_INSTANCES, 0, 0, 0, NULL);
+				freopen(szPipename, "w", stderr);
+				_dup2(_fileno(m_fOut), _fileno(stderr));
+				CloseHandle(hPipe);
+			}
+		}
+		else
+		{
+#endif
+			_dup2(_fileno(m_fOut), _fileno(stdout));
+			_dup2(_fileno(m_fOut), _fileno(stderr));
+#ifdef _MSC_VER
+	}
+#endif
+		::setvbuf(stdout, NULL, _IONBF, 0);
+		::setvbuf(stderr, NULL, _IONBF, 0);
+		//close(hOut);
 	}
 	~COutPtr()
 	{
-		*stdout = m_fStdout;
-		*stderr = m_fStderr;
 		fclose(m_fOut);
 	}
 
 	FILE *m_fOut;
-	FILE m_fStdout;
-	FILE m_fStderr;
 };
 
 /*! Устанавливает поток вывода. Для работы консоли
diff --git a/source/xcommon/IXCore.h b/source/xcommon/IXCore.h
index 1e291a06666462eceaaeb39c8fb5829bbd675b86..113aac443196e133a4dee76e3824d55237ce6a4c 100644
--- a/source/xcommon/IXCore.h
+++ b/source/xcommon/IXCore.h
@@ -69,22 +69,44 @@ class CCoreOutPtr
 		m_fOut = ::_fdopen(_dup(hOut), "a+");
 		::setvbuf(m_fOut, NULL, _IONBF, 0);
 
-		m_fStdout = *stdout;
-		m_fStderr = *stderr;
-
-		*stdout = *m_fOut;
-		*stderr = *m_fOut;
+#ifdef _MSC_VER
+		if(_fileno(stdout) < 0)
+		{
+			char szPipename[255];
+			HANDLE hPipe = NULL;
+			{
+				sprintf(szPipename, "\\\\.\\pipe\\SkyXEngineConsoleStdout-%u-%u", GetCurrentProcessId(), GetCurrentThreadId());
+				hPipe = CreateNamedPipe(szPipename, PIPE_ACCESS_DUPLEX, PIPE_NOWAIT | PIPE_READMODE_BYTE, PIPE_UNLIMITED_INSTANCES, 0, 0, 0, NULL);
+				freopen(szPipename, "w", stdout);
+				_dup2(_fileno(m_fOut), _fileno(stdout));
+				CloseHandle(hPipe);
+			}
+
+			{
+				sprintf(szPipename, "\\\\.\\pipe\\SkyXEngineConsoleStderr-%u-%u", GetCurrentProcessId(), GetCurrentThreadId());
+				hPipe = CreateNamedPipe(szPipename, PIPE_ACCESS_DUPLEX, PIPE_NOWAIT | PIPE_READMODE_BYTE, PIPE_UNLIMITED_INSTANCES, 0, 0, 0, NULL);
+				freopen(szPipename, "w", stderr);
+				_dup2(_fileno(m_fOut), _fileno(stderr));
+				CloseHandle(hPipe);
+			}
+		}
+		else
+		{
+#endif
+			_dup2(_fileno(m_fOut), _fileno(stdout));
+			_dup2(_fileno(m_fOut), _fileno(stderr));
+#ifdef _MSC_VER
+		}
+#endif
+		::setvbuf(stdout, NULL, _IONBF, 0);
+		::setvbuf(stderr, NULL, _IONBF, 0);
 	}
 	~CCoreOutPtr()
 	{
-		*stdout = m_fStdout;
-		*stderr = m_fStderr;
 		fclose(m_fOut);
 	}
 
 	FILE *m_fOut;
-	FILE m_fStdout;
-	FILE m_fStderr;
 };
 
 /*! Устанавливает поток вывода. Для работы консоли