bool SetupWin32ConsoleIO() { #if defined( _WIN32 ) // Only useful on Windows platforms bool newConsole( false ); if ( GetFileType( GetStdHandle( STD_OUTPUT_HANDLE ) ) == FILE_TYPE_UNKNOWN ) { HINSTANCE hInst = ::LoadLibrary( "kernel32.dll" ); typedef BOOL ( WINAPI * pAttachConsole_t )( DWORD ); pAttachConsole_t pAttachConsole( ( BOOL ( _stdcall * )( DWORD ) )GetProcAddress( hInst, "AttachConsole" ) ); if ( !( pAttachConsole && (*pAttachConsole)( ( DWORD ) - 1 ) ) ) { newConsole = true; AllocConsole(); } *stdout = *_fdopen( _open_osfhandle( reinterpret_cast< long >( GetStdHandle( STD_OUTPUT_HANDLE ) ), _O_TEXT ), "w" ); setvbuf( stdout, NULL, _IONBF, 0 ); *stdin = *_fdopen( _open_osfhandle( reinterpret_cast< long >( GetStdHandle( STD_INPUT_HANDLE ) ), _O_TEXT ), "r" ); setvbuf( stdin, NULL, _IONBF, 0 ); *stderr = *_fdopen( _open_osfhandle( reinterpret_cast< long >( GetStdHandle( STD_ERROR_HANDLE ) ), _O_TEXT ), "w" ); setvbuf( stdout, NULL, _IONBF, 0 ); std::ios_base::sync_with_stdio(); } return newConsole; #else // defined( _WIN32 ) return false; #endif // defined( _WIN32 ) }
int OpenDebugLog() { #if defined (FBA_DEBUG) #if defined (APP_DEBUG_LOG) time_t nTime; tm* tmTime; time(&nTime); tmTime = localtime(&nTime); { // Initialise the debug log file #ifdef _UNICODE DebugLog = _tfopen(_T("zzBurnDebug.html"), _T("wb")); if (ftell(DebugLog) == 0) { WRITE_UNICODE_BOM(DebugLog); _ftprintf(DebugLog, _T("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">")); _ftprintf(DebugLog, _T("<html><head><meta http-equiv=Content-Type content=\"text/html; charset=unicode\"></head><body><pre>")); } #else DebugLog = _tfopen(_T("zzBurnDebug.html"), _T("wt")); if (ftell(DebugLog) == 0) { _ftprintf(DebugLog, _T("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">")); _ftprintf(DebugLog, _T("<html><head><meta http-equiv=Content-Type content=\"text/html; charset=windows-%i\"></head><body><pre>"), GetACP()); } #endif _ftprintf(DebugLog, _T("</font><font size=larger color=#000000>")); _ftprintf(DebugLog, _T("Debug log created by ") _T(APP_TITLE) _T(" v%.20s on %s\n<br>"), szAppBurnVer, _tasctime(tmTime)); } #endif { // Initialise the debug console COORD DebugBufferSize = { 80, 1000 }; { // Since AttachConsole is only present in Windows XP, import it manually #if _WIN32_WINNT >= 0x0500 && defined (_MSC_VER) // #error Manually importing AttachConsole() function, but compiling with _WIN32_WINNT >= 0x0500 if (!AttachConsole(ATTACH_PARENT_PROCESS)) { AllocConsole(); } #else #define ATTACH_PARENT_PROCESS ((DWORD)-1) BOOL (WINAPI* pAttachConsole)(DWORD dwProcessId) = NULL; HINSTANCE hKernel32DLL = LoadLibrary(_T("kernel32.dll")); if (hKernel32DLL) { pAttachConsole = (BOOL (WINAPI*)(DWORD))GetProcAddress(hKernel32DLL, "AttachConsole"); } if (pAttachConsole) { if (!pAttachConsole(ATTACH_PARENT_PROCESS)) { AllocConsole(); } } else { AllocConsole(); } if (hKernel32DLL) { FreeLibrary(hKernel32DLL); } #undef ATTACH_PARENT_PROCESS #endif } DWORD ignore; DebugBuffer = CreateConsoleScreenBuffer(GENERIC_WRITE, FILE_SHARE_READ, NULL, CONSOLE_TEXTMODE_BUFFER, NULL); SetConsoleScreenBufferSize(DebugBuffer, DebugBufferSize); SetConsoleActiveScreenBuffer(DebugBuffer); SetConsoleTitle(_T(APP_TITLE) _T(" Debug console")); SetConsoleTextAttribute(DebugBuffer, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); _sntprintf(szConsoleBuffer, 1024, _T("Welcome to the ") _T(APP_TITLE) _T(" debug console.\n")); WriteConsole(DebugBuffer, szConsoleBuffer, _tcslen(szConsoleBuffer), &ignore, NULL); SetConsoleTextAttribute(DebugBuffer, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); if (DebugLog) { _sntprintf(szConsoleBuffer, 1024, _T("Debug messages are logged in zzBurnDebug.html")); if (!DebugLog || bEchoLog) { _sntprintf(szConsoleBuffer + _tcslen(szConsoleBuffer), 1024 - _tcslen(szConsoleBuffer), _T(", and echod to this console")); } _sntprintf(szConsoleBuffer + _tcslen(szConsoleBuffer), 1024 - _tcslen(szConsoleBuffer), _T(".\n\n")); } else { _sntprintf(szConsoleBuffer, 1024, _T("Debug messages are echod to this console.\n\n")); } WriteConsole(DebugBuffer, szConsoleBuffer, _tcslen(szConsoleBuffer), &ignore, NULL); } nPrevConsoleStatus = -1; bprintf = AppDebugPrintf; // Redirect Burn library debug to our function #endif return 0; }