|
|
//----------------------------------------------------------------------------
//
// Copyright (c) 1997-1999 Microsoft Corporation
// All rights reserved.
//
// File Name:
// msg.c
//
// Description:
// This file contains the low-level error reporting routines.
//
//----------------------------------------------------------------------------
#include "pch.h"
#define MAX_ERROR_MSG_LEN 1024
#define MAX_ERROR_CAPTION_LEN 64
#define MAJORTYPE_MASK 0xff
static TCHAR *StrError = NULL;
int ReportErrorLow( HWND hwnd, DWORD dwMsgType, LPTSTR lpMessageStr, va_list arglist);
int __cdecl ReportErrorId( HWND hwnd, // calling window
DWORD dwMsgType, // combo of MSGTYPE_*
UINT StringId, ...) { int iRet; va_list arglist; TCHAR *Str;
Str = MyLoadString(StringId);
if ( Str == NULL ) { AssertMsg(FALSE, "Invalid StringId"); return IDCANCEL; }
va_start(arglist, StringId);
iRet = ReportErrorLow(hwnd, dwMsgType, Str, arglist); va_end(arglist); free(Str); return iRet; }
//---------------------------------------------------------------------------
//
// Function: ReportErrorLow
//
// Purpose: This is the routine to report errors to the user for the
// Setup Manager wizard.
//
// Arguments:
// HWND hwnd - calling window
// DWORD dwMsgType - combo of MSGTYPE_* (see supplib.h)
// LPTSTR lpMessageStr - message string
// va_list arglist - args to expand
//
// Returns:
// Whatever MessageBox returns.
//
//---------------------------------------------------------------------------
int ReportErrorLow( HWND hwnd, // calling window
DWORD dwMsgType, // combo of MSGTYPE_*
LPTSTR lpMessageStr, // passed to sprintf
va_list arglist) { DWORD dwLastError; DWORD dwMajorType; TCHAR MessageBuffer[MAX_ERROR_MSG_LEN] = _T(""); TCHAR CaptionBuffer[MAX_ERROR_CAPTION_LEN] = _T(""); DWORD dwMessageBoxFlags; HRESULT hrPrintf;
//
// Hurry and get the last error before it changes.
//
if ( dwMsgType & MSGTYPE_WIN32 ) dwLastError = GetLastError();
if( StrError == NULL ) { StrError = MyLoadString( IDS_ERROR ); }
//
// Caller must specify _err or _warn or _yesno or _retrycancel, and
// Caller must specify only one of them
//
// Note, we reserved 8 bits for the "MajorType".
//
dwMajorType = dwMsgType & MAJORTYPE_MASK;
if ( dwMajorType != MSGTYPE_ERR && dwMajorType != MSGTYPE_WARN && dwMajorType != MSGTYPE_YESNO && dwMajorType != MSGTYPE_RETRYCANCEL ) {
AssertMsg(FALSE, "Invalid MSGTYPE"); }
//
// Expand the string and varargs the caller might have passed in.
//
if ( lpMessageStr ) hrPrintf=StringCchVPrintf(MessageBuffer, AS(MessageBuffer), lpMessageStr, arglist);
//
// Retrieve the error message for the Win32 error code and suffix
// it onto the callers expanded string.
//
if ( dwMsgType & MSGTYPE_WIN32 ) {
TCHAR *pEndOfBuff = MessageBuffer + lstrlen(MessageBuffer);
hrPrintf=StringCchPrintf(pEndOfBuff, (AS(MessageBuffer)-lstrlen(MessageBuffer)), _T("\r\n\r%s #%d: "), StrError, dwLastError); pEndOfBuff += lstrlen(pEndOfBuff);
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, dwLastError, 0, pEndOfBuff, (DWORD)(MAX_ERROR_MSG_LEN - (pEndOfBuff-MessageBuffer)), NULL); }
if( g_StrWizardTitle == NULL ) { g_StrWizardTitle = MyLoadString( IDS_WIZARD_TITLE ); }
//
// Set the caption and compute the flags to pass to MessageBox()
//
lstrcpyn( CaptionBuffer, g_StrWizardTitle, AS(CaptionBuffer) );
dwMessageBoxFlags = MB_OK | MB_ICONERROR;
if ( dwMajorType == MSGTYPE_YESNO ) dwMessageBoxFlags = MB_YESNO | MB_ICONQUESTION;
else if ( dwMajorType == MSGTYPE_WARN ) dwMessageBoxFlags = MB_OK | MB_ICONWARNING;
else if ( dwMajorType == MSGTYPE_RETRYCANCEL ) dwMessageBoxFlags = MB_RETRYCANCEL | MB_ICONERROR;
//
// Display the error message
//
return MessageBox(hwnd, MessageBuffer, CaptionBuffer, dwMessageBoxFlags); }
//---------------------------------------------------------------------------
//
// Function: SetupMgrAssert
//
// Purpose: Reports DBG assertion failures.
//
// Note: Only pass ANSI strings.
// Use the macros in supplib.h.
//
//---------------------------------------------------------------------------
#if DBG
VOID __cdecl SetupMgrAssert(char *pszFile, int iLine, char *pszFormat, ...) { char Buffer[MAX_ERROR_MSG_LEN], *pEnd; va_list arglist; HRESULT hrPrintf;
if ( pszFormat ) { va_start(arglist, pszFormat); hrPrintf=StringCchVPrintfA(Buffer, AS(Buffer), pszFormat, arglist); va_end(arglist); }
hrPrintf=StringCchPrintfA(Buffer+strlen(Buffer), MAX_ERROR_MSG_LEN-strlen(Buffer), "\r\nFile: %s\r\nLine: %d", pszFile, iLine);
MessageBoxA(NULL, Buffer, "Assertion Failure", MB_OK); } #endif
|