?? spdebug.h
字號:
/*******************************************************************************
* SPDebug.h *
*-----------*
* Description:
* This header file contains debug output services for SAPI5
*-------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
*******************************************************************************/
#pragma once
#include <TCHAR.h>
#include <crtdbg.h>
#ifdef ASSERT_WITH_STACK
#include "AssertWithStack.h"
#endif
const TCHAR g_szSpDebugKey[] = _T("SPDebug");
const TCHAR g_szSpDebugFuncTraceReportMode[] = _T("FuncTraceMode");
const TCHAR g_szSpDebugFuncTraceReportFile[] = _T("FuncTraceFile");
const TCHAR g_szSpDebugParamInfoReportMode[] = _T("ParamInfoMode");
const TCHAR g_szSpDebugParamInfoReportFile[] = _T("ParamInfoFile");
const TCHAR g_szSpDebugDumpInfoReportMode[] = _T("DumpInfoMode");
const TCHAR g_szSpDebugDumpInfoReportFile[] = _T("DumpInfoFile");
const TCHAR g_szSpDebugAssertReportMode[] = _T("AssertMode");
const TCHAR g_szSpDebugAssertReportFile[] = _T("AssertFile");
const TCHAR g_szSpDebugHRFailReportMode[] = _T("HRFailMode");
const TCHAR g_szSpDebugHRFailReportFile[] = _T("HRFailFile");
const TCHAR g_szSpDebugAssertSettingsReReadEachTime[] = _T("AssertSettingsReReadEachTime");
const TCHAR g_szSpDebugServerOnStart[] = _T("DebugServerOnStart");
const TCHAR g_szSpDebugClientOnStart[] = _T("DebugClientOnStart");
const TCHAR g_szSpDebugLog[] = _T("c:\\spdebug.log");
#ifdef _DEBUG
class CSpDebug
{
public:
CSpDebug()
{
m_mutex = NULL;
m_reportModePrev = -1;
m_hfilePrev = NULL;
Read();
}
~CSpDebug()
{
if (m_mutex != NULL)
{
CloseHandle(m_mutex);
}
}
BOOL FuncTrace(BOOL fEnter = TRUE)
{
return fEnter
? Enter(_CRT_WARN, m_FuncTraceMode, m_szFuncTraceFile)
: Leave();
}
BOOL ParamInfo(BOOL fEnter = TRUE)
{
return fEnter
? Enter(_CRT_WARN, m_ParamInfoMode, m_szParamInfoFile)
: Leave();
}
BOOL DumpInfo(BOOL fEnter = TRUE)
{
return fEnter
? Enter(_CRT_WARN, m_DumpInfoMode, m_szDumpInfoFile)
: Leave();
}
BOOL Assert(BOOL fEnter = TRUE)
{
if (m_fAssertSettingsReReadEachTime)
Read();
return fEnter
? Enter(_CRT_ASSERT, m_AssertMode, m_szAssertFile)
: Leave();
}
BOOL HRFail(BOOL fEnter = TRUE)
{
return fEnter
? Enter(_CRT_WARN, m_HRFailMode, m_szHRFailFile)
: Leave();
}
BOOL DebugServerOnStart()
{
return m_fDebugServerOnStart;
}
BOOL DebugClientOnStart()
{
return m_fDebugClientOnStart;
}
private:
void Read()
{
HKEY hkeyDebug;
RegCreateKeyEx(
HKEY_CLASSES_ROOT,
g_szSpDebugKey,
0,
NULL,
0,
KEY_READ | KEY_WRITE,
NULL,
&hkeyDebug,
NULL);
if (hkeyDebug == NULL)
{
RegCreateKeyEx(
HKEY_CLASSES_ROOT,
g_szSpDebugKey,
0,
NULL,
0,
KEY_READ,
NULL,
&hkeyDebug,
NULL);
}
DWORD dw = sizeof(m_fAssertSettingsReReadEachTime);
if (RegQueryValueEx(
hkeyDebug,
g_szSpDebugAssertSettingsReReadEachTime,
NULL,
NULL,
LPBYTE(&m_fAssertSettingsReReadEachTime),
&dw) != ERROR_SUCCESS)
{
m_fAssertSettingsReReadEachTime = FALSE;
RegSetValueEx(
hkeyDebug,
g_szSpDebugAssertSettingsReReadEachTime,
NULL,
REG_DWORD,
LPBYTE(&m_fAssertSettingsReReadEachTime),
sizeof(m_fAssertSettingsReReadEachTime));
}
ReadFor(
hkeyDebug,
g_szSpDebugFuncTraceReportMode,
g_szSpDebugFuncTraceReportFile,
&m_FuncTraceMode,
m_szFuncTraceFile,
0,
g_szSpDebugLog);
ReadFor(
hkeyDebug,
g_szSpDebugParamInfoReportMode,
g_szSpDebugParamInfoReportFile,
&m_ParamInfoMode,
m_szParamInfoFile,
0,
g_szSpDebugLog);
ReadFor(
hkeyDebug,
g_szSpDebugDumpInfoReportMode,
g_szSpDebugDumpInfoReportFile,
&m_DumpInfoMode,
m_szDumpInfoFile,
_CRTDBG_MODE_DEBUG,
g_szSpDebugLog);
ReadFor(
hkeyDebug,
g_szSpDebugAssertReportMode,
g_szSpDebugAssertReportFile,
&m_AssertMode,
m_szAssertFile,
_CRTDBG_MODE_WNDW,
g_szSpDebugLog);
ReadFor(
hkeyDebug,
g_szSpDebugHRFailReportMode,
g_szSpDebugHRFailReportFile,
&m_HRFailMode,
m_szHRFailFile,
_CRTDBG_MODE_DEBUG,
g_szSpDebugLog);
dw = sizeof(m_fDebugServerOnStart);
if (RegQueryValueEx(
hkeyDebug,
g_szSpDebugServerOnStart,
NULL,
NULL,
LPBYTE(&m_fDebugServerOnStart),
&dw) != ERROR_SUCCESS)
{
m_fDebugServerOnStart = FALSE;
RegSetValueEx(
hkeyDebug,
g_szSpDebugServerOnStart,
NULL,
REG_DWORD,
LPBYTE(&m_fDebugServerOnStart),
sizeof(m_fDebugServerOnStart));
}
dw = sizeof(m_fDebugClientOnStart);
if (RegQueryValueEx(
hkeyDebug,
g_szSpDebugClientOnStart,
NULL,
NULL,
LPBYTE(&m_fDebugClientOnStart),
&dw) != ERROR_SUCCESS)
{
m_fDebugClientOnStart = FALSE;
RegSetValueEx(
hkeyDebug,
g_szSpDebugClientOnStart,
NULL,
REG_DWORD,
LPBYTE(&m_fDebugClientOnStart),
sizeof(m_fDebugClientOnStart));
}
RegCloseKey(hkeyDebug);
}
void ReadFor(
HKEY hkey,
const TCHAR * pszModeValueName,
const TCHAR * pszFileValueName,
DWORD * pdwModeValue,
TCHAR * pszFileValue,
DWORD dwDefaultModeValue,
const TCHAR * pszDefaultFileValue)
{
DWORD dw = sizeof(*pdwModeValue);
if (RegQueryValueEx(
hkey,
pszModeValueName,
NULL,
NULL,
LPBYTE(pdwModeValue),
&dw) != ERROR_SUCCESS)
{
*pdwModeValue = dwDefaultModeValue;
RegSetValueEx(
hkey,
pszModeValueName,
NULL,
REG_DWORD,
LPBYTE(pdwModeValue),
sizeof(*pdwModeValue));
}
dw = MAX_PATH;
if (RegQueryValueEx(
hkey,
pszFileValueName,
NULL,
NULL,
LPBYTE(pszFileValue),
&dw) != ERROR_SUCCESS)
{
_tcscpy(pszFileValue, pszDefaultFileValue);
RegSetValueEx(
hkey,
pszFileValueName,
NULL,
REG_SZ,
LPBYTE(pszFileValue),
MAX_PATH);
}
}
BOOL Enter(int reportType, DWORD &reportMode, TCHAR * pszFile)
{
if (reportMode != 0)
{
// We'll hold the mutex, until the caller also calls Leave
if (m_mutex == NULL)
{
m_mutex = CreateMutex(NULL, FALSE, _T("SpDebug"));
}
WaitForSingleObject(m_mutex, INFINITE);
m_reportType = reportType;
m_reportModePrev = _CrtSetReportMode(reportType, reportMode);
if (reportMode & _CRTDBG_MODE_FILE)
{
HANDLE hfile = CreateFile(
pszFile,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
OPEN_ALWAYS,
0,
NULL);
SetFilePointer(hfile, 0, NULL, FILE_END);
m_hfilePrev = (_HFILE)_CrtSetReportFile(reportType, (_HFILE)hfile);
}
return TRUE;
}
return FALSE;
}
BOOL Leave()
{
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -