mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
227 lines
7.3 KiB
227 lines
7.3 KiB
//=--------------------------------------------------------------------------=
|
|
// Debug.Cpp
|
|
//=--------------------------------------------------------------------------=
|
|
// Copyright 1995 Microsoft Corporation. All Rights Reserved.
|
|
//
|
|
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
|
|
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
|
|
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
|
|
// PARTICULAR PURPOSE.
|
|
//=--------------------------------------------------------------------------=
|
|
//
|
|
// contains various methods that will only really see any use in DEBUG builds
|
|
//
|
|
#include "pch.h"
|
|
|
|
#ifdef DEBUG
|
|
#include <stdlib.h>
|
|
|
|
//=--------------------------------------------------------------------------=
|
|
// Private Constants
|
|
//---------------------------------------------------------------------------=
|
|
//
|
|
static const char szFormat[] = "%s\nFile %s, Line %d";
|
|
static const char szFormat2[] = "%s\n%s\nFile %s, Line %d";
|
|
|
|
#define _SERVERNAME_ "ActiveX Framework"
|
|
#define CTL_INI_SIZE 14
|
|
|
|
static const char szTitle[] = _SERVERNAME_ " Assertion (Abort = UAE, Retry = INT 3, Ignore = Continue)";
|
|
|
|
|
|
//=--------------------------------------------------------------------------=
|
|
// Local functions
|
|
//=--------------------------------------------------------------------------=
|
|
int NEAR _IdMsgBox(LPSTR pszText, LPCSTR pszTitle, UINT mbFlags);
|
|
|
|
//=--------------------------------------------------------------------------=
|
|
// DisplayAssert
|
|
//=--------------------------------------------------------------------------=
|
|
// Display an assert message box with the given pszMsg, pszAssert, source
|
|
// file name, and line number. The resulting message box has Abort, Retry,
|
|
// Ignore buttons with Abort as the default. Abort does a FatalAppExit;
|
|
// Retry does an int 3 then returns; Ignore just returns.
|
|
//
|
|
VOID DisplayAssert
|
|
(
|
|
LPSTR pszMsg,
|
|
LPSTR pszAssert,
|
|
LPSTR pszFile,
|
|
UINT line
|
|
)
|
|
{
|
|
LPTSTR lpszText;
|
|
|
|
char szMsg[512];
|
|
|
|
lpszText = pszMsg; // Assume no file & line # info
|
|
|
|
// If C file assert, where you've got a file name and a line #
|
|
//
|
|
if (pszFile) {
|
|
|
|
// Then format the assert nicely
|
|
//
|
|
wsprintf(szMsg, szFormat, (pszMsg&&*pszMsg) ? pszMsg : pszAssert, pszFile, line);
|
|
lpszText = szMsg;
|
|
}
|
|
|
|
// Put up a dialog box
|
|
//
|
|
switch (_IdMsgBox(lpszText, szTitle, MB_ICONHAND|MB_ABORTRETRYIGNORE|MB_SYSTEMMODAL)) {
|
|
case IDABORT:
|
|
FatalAppExit(0, lpszText);
|
|
return;
|
|
|
|
case IDRETRY:
|
|
// call the win32 api to break us.
|
|
//
|
|
DebugBreak();
|
|
return;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
//=---------------------------------------------------------------------------=
|
|
// Beefed-up version of WinMessageBox.
|
|
//=---------------------------------------------------------------------------=
|
|
//
|
|
int NEAR _IdMsgBox
|
|
(
|
|
LPSTR pszText,
|
|
LPCSTR pszTitle,
|
|
UINT mbFlags
|
|
)
|
|
{
|
|
HWND hwndActive;
|
|
MSG msg;
|
|
int id;
|
|
|
|
hwndActive = GetActiveWindow();
|
|
|
|
id = MessageBox(hwndActive, pszText, pszTitle, mbFlags);
|
|
if(PeekMessage(&msg, NULL, WM_QUIT, WM_QUIT, PM_REMOVE))
|
|
{
|
|
id = MessageBox(hwndActive, pszText, pszTitle, mbFlags);
|
|
PostMessage(msg.hwnd, msg.message, msg.wParam, msg.lParam);
|
|
}
|
|
|
|
return id;
|
|
}
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
// Implementation for class CtlSwitch
|
|
//---------------------------------------------------------------------------
|
|
|
|
CtlSwitch* CtlSwitch::g_pctlswFirst = NULL;
|
|
|
|
//=---------------------------------------------------------------------------=
|
|
// CtlSwitch::InitSwitch - Initialize members and add new object to
|
|
// linked-list
|
|
//=---------------------------------------------------------------------------=
|
|
void CtlSwitch::InitSwitch
|
|
(
|
|
char * pszName
|
|
)
|
|
{
|
|
// set fields
|
|
m_pszName = pszName;
|
|
m_fSet = FALSE;
|
|
|
|
// link into global list of switches
|
|
this->m_pctlswNext = g_pctlswFirst;
|
|
g_pctlswFirst = this;
|
|
|
|
}
|
|
|
|
|
|
//=---------------------------------------------------------------------------=
|
|
// SetCtlSwitches:
|
|
// Initialize linked-list control switches to those values set in the
|
|
// corresponding .ini files
|
|
//=---------------------------------------------------------------------------=
|
|
VOID SetCtlSwitches
|
|
(
|
|
LPSTR lpCtlPath
|
|
)
|
|
{
|
|
TCHAR lpWindowsDir[128]; // Path to Windows directory
|
|
UINT uMaxWinPathSize = 128; // Max size for Win path
|
|
UINT uPathSize; // Actual Win path size
|
|
|
|
LPCTSTR lpAllSwitch = "allctls"; // Name of section which applies to all ctls
|
|
char lpszCtlName[128]; // Name of ctl (minus extension) to act as section name in INI
|
|
LPCTSTR lpFileName = "\\CtlSwtch.ini"; // Name of INI file
|
|
char lpStatus[4]; // Status of switch (on/off)
|
|
LPCTSTR lpDefaultStatus = "set"; // Default status
|
|
LPCTSTR lpTurnOff = "off";
|
|
LPCTSTR lpTurnOn = "on";
|
|
DWORD nSizeStatus = 4; // Size of status switch
|
|
DWORD fSet; // If switch is set in INI
|
|
|
|
// Create path to CtlSwtch.ini in the Windows directory
|
|
uPathSize = GetWindowsDirectory(lpWindowsDir, uMaxWinPathSize) + CTL_INI_SIZE;
|
|
lstrcat(lpWindowsDir, lpFileName);
|
|
|
|
// Create section name for control (control name minus extension)
|
|
lstrcpyn(lpszCtlName, lpCtlPath, strlen(lpCtlPath) - 3);
|
|
int curChar = strlen(lpszCtlName);
|
|
int charCount = 0;
|
|
while (lpszCtlName[curChar] != '\\')
|
|
{
|
|
curChar--;
|
|
charCount++;
|
|
}
|
|
curChar++;
|
|
lstrcpyn(lpszCtlName, &lpCtlPath[curChar], charCount);
|
|
|
|
// Use CTLSWTCH.INI to set switches. If not defined in INI file, create switch
|
|
for (CtlSwitch* pctlsw = CtlSwitch::g_pctlswFirst; pctlsw; pctlsw = pctlsw->m_pctlswNext)
|
|
{
|
|
// Specific control switches override the "allctls" switch
|
|
fSet = GetPrivateProfileString(lpszCtlName, (LPCTSTR)pctlsw->m_pszName, lpDefaultStatus, (LPTSTR)lpStatus, nSizeStatus, (LPCTSTR)lpWindowsDir);
|
|
|
|
// If switch is not set for control, use "allctls" switch
|
|
if ((fSet == 0) || (strcmp(lpStatus, "set") == 0))
|
|
{
|
|
fSet = GetPrivateProfileString(lpAllSwitch, (LPCTSTR)pctlsw->m_pszName, lpDefaultStatus, (LPTSTR)lpStatus, nSizeStatus, (LPCTSTR)lpWindowsDir);
|
|
|
|
// If INI file or switch do not exist, create one...
|
|
if ((fSet == 0) || (strcmp(lpStatus, "set") == 0))
|
|
{
|
|
// If switch was initialized TRUE, turn it on
|
|
if (pctlsw->m_fSet != 0)
|
|
WritePrivateProfileString(lpszCtlName, (LPCTSTR)pctlsw->m_pszName, (LPTSTR)lpTurnOn, (LPCTSTR)lpWindowsDir);
|
|
// Else turn it off
|
|
else
|
|
{
|
|
WritePrivateProfileString(lpAllSwitch, (LPCTSTR)pctlsw->m_pszName, (LPTSTR)lpTurnOff, (LPCTSTR)lpWindowsDir);
|
|
WritePrivateProfileString(lpszCtlName, (LPCTSTR)pctlsw->m_pszName, (LPTSTR)lpTurnOff, (LPCTSTR)lpWindowsDir);
|
|
pctlsw->m_fSet = FALSE;
|
|
}
|
|
}
|
|
else if ((strcmp(lpStatus, "on") == 0))
|
|
{
|
|
WritePrivateProfileString(lpszCtlName, (LPCTSTR)pctlsw->m_pszName, (LPTSTR)lpStatus, (LPCTSTR)lpWindowsDir);
|
|
pctlsw->m_fSet = TRUE;
|
|
}
|
|
else
|
|
{
|
|
WritePrivateProfileString(lpszCtlName, (LPCTSTR)pctlsw->m_pszName, (LPTSTR)lpTurnOff, (LPCTSTR)lpWindowsDir);
|
|
pctlsw->m_fSet = FALSE;
|
|
}
|
|
}
|
|
else if ((strcmp(lpStatus, "on") == 0))
|
|
pctlsw->m_fSet = TRUE;
|
|
else
|
|
pctlsw->m_fSet = FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
#endif
|