//=--------------------------------------------------------------------------= // 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 //=--------------------------------------------------------------------------= // 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