Commit 2a2f4b8e authored by D-AIRY's avatar D-AIRY

Fixed console output handling p2

parent 8e02d479
......@@ -55,24 +55,44 @@ protected:
virtual IBaseEventChannel *getEventChannelInternal(const XGUID &guid) = 0;
};
/*! Устанавливает поток вывода. Для работы консоли
\warning Должна быть инлайнова, чтобы выполняться в контексте вызывающей библиотеки
*/
__inline void Core_SetOutPtr(IXCore *pCore)
class CCoreOutPtr
{
UINT_PTR sock = pCore->getCrtOutputHandler();
if(sock == ~0)
friend void Core_SetOutPtr(IXCore *pCore);
CCoreOutPtr(IXCore *pCore)
{
UINT_PTR sock = pCore->getCrtOutputHandler();
if(sock == ~0)
{
return;
}
int hOut = _open_osfhandle(sock, O_RDONLY | O_RDWR | O_WRONLY | _O_APPEND);
m_fOut = ::_fdopen(_dup(hOut), "a+");
::setvbuf(m_fOut, NULL, _IONBF, 0);
m_fStdout = *stdout;
m_fStderr = *stderr;
*stdout = *m_fOut;
*stderr = *m_fOut;
}
~CCoreOutPtr()
{
return;
*stdout = m_fStdout;
*stderr = m_fStderr;
fclose(m_fOut);
}
int hOut = _open_osfhandle(sock, O_RDONLY | O_RDWR | O_WRONLY | _O_APPEND);
FILE * fOut = ::_fdopen(hOut, "a+");
::setvbuf(fOut, NULL, _IONBF, 0);
*stdout = *fOut;
*stderr = *fOut;
FILE *m_fOut;
FILE m_fStdout;
FILE m_fStderr;
};
fOut->_file = 1;
/*! Устанавливает поток вывода. Для работы консоли
\warning Должна быть инлайнова, чтобы выполняться в контексте вызывающей библиотеки
*/
__inline void Core_SetOutPtr(IXCore *pCore)
{
static CCoreOutPtr s_optr(pCore);
}
#define INIT_OUTPUT_STREAM(icore) Core_SetOutPtr(icore)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment