windows-nt/Source/XPSP1/NT/printscan/ui/uicommon/errors.cpp
2020-09-26 16:20:57 +08:00

124 lines
3.6 KiB
C++

#include "precomp.h"
#pragma hdrstop
namespace UIErrors
{
/**************************************
UIErrors::ReportResult
Given an HRESULT, map it to a user friendly message (when possible).
If we don't have a mapping, defer to FormatMessage (ugh!)
This function should be a last resort.
***************************************/
VOID
ReportResult (HWND hwndParent, HINSTANCE hInst, HRESULT hr)
{
switch (hr)
{
case RPC_E_CALL_REJECTED:
case RPC_E_RETRY:
case RPC_E_TIMEOUT:
ReportError (hwndParent, hInst, ErrStiBusy);
break;
case RPC_E_SERVER_DIED:
case RPC_E_SERVER_DIED_DNE:
case RPC_E_DISCONNECTED:
ReportError (hwndParent, hInst, ErrStiCrashed);
break;
default:
LPTSTR szErrMsg = NULL;
FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
hr,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
reinterpret_cast<LPTSTR>(&szErrMsg),
0,
NULL
);
if (szErrMsg)
{
CSimpleString strTitle;
strTitle.LoadString (IDS_ERRTITLE_HRESULT, hInst);
ReportMessage (hwndParent, hInst, NULL, strTitle, szErrMsg);
}
else
{
ReportMessage (hwndParent, hInst, NULL, MAKEINTRESOURCE(IDS_ERRTITLE_UNKNOWNERR), MAKEINTRESOURCE(IDS_ERROR_UNKNOWNERR));
}
break;
}
}
/**************************************
UIErrors::ReportMessage
These functions wrap MessageBoxIndirect to
display given strings.
***************************************/
VOID
ReportMessage (HWND hwndParent,
HINSTANCE hInst,
LPCTSTR idIcon,
LPCTSTR idTitle,
LPCTSTR idMessage,
DWORD dwStyle)
{
MSGBOXPARAMS mbp = {0};
mbp.cbSize = sizeof(MSGBOXPARAMS);
mbp.hwndOwner = hwndParent;
mbp.hInstance = hInst;
mbp.lpszText = idMessage;
mbp.lpszCaption = idTitle;
mbp.dwStyle = MB_OK | dwStyle;
if (idIcon)
{
mbp.dwStyle |= MB_USERICON;
mbp.lpszIcon = idIcon;
}
else
{
mbp.lpszIcon = NULL;
}
mbp.dwContextHelpId = 0;
mbp.lpfnMsgBoxCallback = 0;
mbp.dwLanguageId = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT);
MessageBoxIndirect (&mbp);
}
// build an array of message ids indexed by the WiaError enum
struct MsgMap
{
INT idTitle;
INT idMessage;
} ErrorCodes [] =
{
{IDS_ERRTITLE_DISCONNECTED, IDS_ERROR_DISCONNECTED},
{IDS_ERRTITLE_COMMFAILURE, IDS_ERROR_COMMFAILURE},
{IDS_ERRTITLE_STICRASH, IDS_ERROR_STICRASH},
{IDS_ERRTITLE_STIBUSY, IDS_ERROR_STIBUSY},
{IDS_ERRTITLE_SCANFAIL, IDS_ERROR_SCANFAIL},
};
VOID
ReportError (HWND hwndParent,
HINSTANCE hInst,
WiaError err)
{
ReportMessage (hwndParent, hInst, NULL, MAKEINTRESOURCE(ErrorCodes[err].idTitle), MAKEINTRESOURCE(ErrorCodes[err].idMessage));
}
}