Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

210 lines
5.3 KiB

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