//+-------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1996 - 1998. // // File: debug.cxx // // Contents: Debugging routines // // History: 09-04-1997 DavidMun Created // //--------------------------------------------------------------------------- #include "headers.h" #pragma hdrstop DECLARE_INFOLEVEL(role) #if (DBG == 1) ULONG CDbg::s_idxTls; void __cdecl CTimer::Init(LPCSTR pszTitleFmt, ...) { va_list va; va_start(va, pszTitleFmt); m_ulStart = GetTickCount(); WCHAR wzTitleFmt[MAX_PATH]; MultiByteToWideChar(CP_ACP, 0, pszTitleFmt, -1, wzTitleFmt, ARRAYLEN(wzTitleFmt)); int iRet = _vsnwprintf(m_wzTitle, ARRAYLEN(m_wzTitle), wzTitleFmt, va); if (iRet == -1) { // resulting string too large and was truncated. ensure null // termination. m_wzTitle[ARRAYLEN(m_wzTitle) - 1] = L'\0'; } va_end(va); } CTimer::~CTimer() { ULONG ulStop = GetTickCount(); ULONG ulElapsedMS = ulStop - m_ulStart; ULONG ulSec = ulElapsedMS / 1000; ULONG ulMillisec = ulElapsedMS - (ulSec * 1000); Dbg(DEB_PERF, "Timer: %ws took %u.%03us\n", m_wzTitle, ulSec, ulMillisec); } PCWSTR NextNonWs( PCWSTR pwzCur) { while (wcschr(L" \t\n", *pwzCur)) { pwzCur++; } return pwzCur; } //+-------------------------------------------------------------------------- // // Function: IsSingleBitFlag // // Synopsis: Return TRUE if exactly one bit in [flags] is set, FALSE // otherwise. // // History: 08-31-1998 DavidMun Created // //--------------------------------------------------------------------------- BOOL IsSingleBitFlag( ULONG flags) { if (!flags) { return FALSE; } while (!(flags & 1)) { flags >>= 1; } return !(flags & ~1UL); } #define DUMP_IF_SET(fl, bit) \ if (((fl) & (bit)) == (bit)) \ { \ Dbg(DEB_TRACE, " %hs\n", #bit); \ } void IIDtoString( REFIID riid, CString *pstr) { HRESULT hr = S_OK; ULONG lResult; LPOLESTR pwzIID = NULL; HKEY hkInterface = NULL; HKEY hkIID = NULL; do { hr = StringFromIID(riid, &pwzIID); if (FAILED(hr)) break; lResult = RegOpenKey(HKEY_CLASSES_ROOT, L"Interface", &hkInterface); if (lResult != NO_ERROR) break; lResult = RegOpenKey(hkInterface, pwzIID, &hkIID); if (lResult != NO_ERROR) break; WCHAR wzInterfaceName[MAX_PATH] = L""; ULONG cbData = sizeof(wzInterfaceName); lResult = RegQueryValueEx(hkIID, NULL, NULL, NULL, (PBYTE)wzInterfaceName, &cbData); if (*wzInterfaceName) { *pstr = wzInterfaceName; } else { *pstr = pwzIID; } } while (0); if (hkIID) { RegCloseKey(hkIID); } if (hkInterface) { RegCloseKey(hkInterface); } CoTaskMemFree(pwzIID); } void SayNoItf( PCSTR szComponent, REFIID riid) { CString strIID; IIDtoString(riid, &strIID); Dbg(DEB_ERROR, "%hs::QI no interface %ws\n", szComponent, strIID); } #endif // (DBG == 1)