#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(&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)); } }