/*----------------------------------------------------------------------------- debug.cpp This file implements the debuggin features Copyright (c) 1996-1998 Microsoft Corporation All rights reserved Authors: ChrisK Chris Kauffman Histroy: 7/22/96 ChrisK Cleaned and formatted 7/31/96 ValdonB Changes for Win16 -----------------------------------------------------------------------------*/ #include #include #include #include #if defined(WIN16) extern HINSTANCE g_hInst; extern LPSTR g_lpszCommandLine; extern LPSTR GetCommandLine(void); #endif BOOL fInAssert=FALSE; // ############################################################################ // DebugSz // // This function outputs debug string // // Created 1/28/96, Chris Kauffman // ############################################################################ void DebugSz(LPCSTR psz) { #if defined(_DEBUG) OutputDebugString(psz); #endif } // DebugSz // ############################################################################ // Debug Printf to debug output screen void Dprintf(LPCSTR pcsz, ...) { #ifdef _DEBUG va_list argp; char szBuf[1024]; va_start(argp, pcsz); #if 0 vsprintf(szBuf, pcsz, argp); #else wvsprintf(szBuf, pcsz, argp); #endif DebugSz(szBuf); va_end(argp); #endif } // Dprintf() // ############################################################################ // Handle asserts BOOL FAssertProc(LPCSTR szFile, DWORD dwLine, LPCSTR szMsg, DWORD dwFlags) { BOOL fAssertIntoDebugger = FALSE; char szMsgEx[1024], szTitle[255], szFileName[MAX_PATH]; int id; UINT fuStyle; LPTSTR pszCommandLine = GetCommandLine(); //BYTE szTime[80]; #if !defined(WIN16) CHAR szTime[80]; HANDLE hAssertTxt; SYSTEMTIME st; DWORD cbWritten; #endif // no recursive asserts if (fInAssert) { DebugSz("***Recursive Assert***\r\n"); return(FALSE); } fInAssert = TRUE; #if defined(WIN16) GetModuleFileName(g_hInst, szFileName, MAX_PATH); wsprintf(szMsgEx,"%s:#%ld\r\n%s,\r\n%s", szFile, dwLine, szFileName, szMsg); #else GetModuleFileName(NULL, szFileName, MAX_PATH); wsprintf(szMsgEx,"%s:#%d\r\nProcess ID: %d %s, Thread ID: %d\r\n%s", szFile,dwLine,GetCurrentProcessId(),szFileName,GetCurrentThreadId(),szMsg); #endif wsprintf(szTitle,"Assertion Failed"); fuStyle = MB_APPLMODAL | MB_ABORTRETRYIGNORE; fuStyle |= MB_ICONSTOP; DebugSz(szTitle); DebugSz(szMsgEx); // dump the assert into ASSERT.TXT #if !defined(WIN16) hAssertTxt = CreateFile("assert.txt", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH, NULL); if (INVALID_HANDLE_VALUE != hAssertTxt) { SetFilePointer(hAssertTxt, 0, NULL, FILE_END); GetLocalTime(&st); wsprintf(szTime, "\r\n\r\n%02d/%02d/%02d %d:%02d:%02d\r\n", st.wMonth, st.wDay, st.wYear, st.wHour, st.wMinute, st.wSecond); WriteFile(hAssertTxt, szTime, lstrlen(szTime), &cbWritten, NULL); WriteFile(hAssertTxt, szMsgEx, lstrlen(szMsgEx), &cbWritten, NULL); CloseHandle(hAssertTxt); } #endif id = MessageBox(NULL, szMsgEx, szTitle, fuStyle); switch (id) { case IDABORT: #if defined(WIN16) exit(0); #else ExitProcess(0); #endif break; case IDCANCEL: case IDIGNORE: break; case IDRETRY: fAssertIntoDebugger = TRUE; break; } fInAssert = FALSE; return(fAssertIntoDebugger); } // AssertProc()