windows-nt/Source/XPSP1/NT/shell/ext/hnw/shared/debug.cpp
2020-09-26 16:20:57 +08:00

106 lines
2.1 KiB
C++

//
// Debug.cpp
//
// Debug functionality shared between different projects (for use in
// non-MFC projects).
//
// History:
//
// 3/??/96 KenSh Copied from InetSDK sample, added AfxTrace from MFC
// 4/10/96 KenSh Renamed AfxTrace to MyTrace (to avoid linking conflicts
// when linking with MFC).
// 11/15/96 KenSh Automatically break on assert within assert
//
#include "stdafx.h"
#ifdef _DEBUG
#include "Debug.h"
#include <stdlib.h>
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
// determine number of elements in an array (not bytes)
#ifndef _countof
#define _countof(array) (sizeof(array)/sizeof((array)[0]))
#endif
//*** Globals
//
static BOOL g_bInAssert = FALSE;
// DisplayAssert
//
// Given a file and line number, displays an Assertion dialog box with
// Abort/Retry/Ignore choices.
//
// Returns TRUE if the program should break into the debugger, else FALSE.
//
extern "C" BOOL DisplayAssert(LPCSTR pszMessage, LPCSTR pszFile, UINT nLine)
{
char szMsg[250];
if (!pszFile)
pszFile = _T("Unknown file");
if (!pszMessage)
pszMessage = _T("");
// Break on assert within assert
if (g_bInAssert)
{
AfxDebugBreak();
return FALSE;
}
wnsprintf(szMsg, ARRAYSIZE(szMsg), _T("Assertion Failed! Abort, Break, or Ignore?\n\nFile: %s\nLine: %d\n\n%s"),
pszFile, nLine, pszMessage);
HWND hwndActive = GetActiveWindow();
// Put up a dialog box
//
g_bInAssert = TRUE;
int nResult = MessageBox(hwndActive, szMsg, _T("Assertion failed!"),
MB_ICONHAND | MB_ABORTRETRYIGNORE | MB_SYSTEMMODAL);
g_bInAssert = FALSE;
switch(nResult)
{
case IDABORT:
FatalAppExit(0, _T("Bye"));
return FALSE;
case IDRETRY:
return TRUE; // Need to break into debugger
default:
return FALSE; // continue.
}
}
void __cdecl MyTrace(const char* lpszFormat, ...)
{
va_list args;
va_start(args, lpszFormat);
int nBuf;
TCHAR szBuffer[512];
nBuf = wvnsprintf(szBuffer, ARRAYSIZE(szBuffer), lpszFormat, args);
ASSERT(nBuf < _countof(szBuffer));
OutputDebugString(szBuffer);
va_end(args);
}
#endif // _DEBUG