211 lines
5.3 KiB
C
211 lines
5.3 KiB
C
//----------------------------------------------------------------------------
|
|
//
|
|
// 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
|