//============================================================================= // // WbemError.cpp // // Copyright (c) 1997-1999 Microsoft Corporation // // Implements string table based, error msgs for all of wbem. // // History: // // a-khint 5-mar-98 Created. // //============================================================================= #include "precomp.h" #include "WbemError.h" #include "resource.h" #include //--------------PUBLIC----------------------------- #define TEMP_BUF 512 POLARITY bool ErrorStringEx(HRESULT hr, TCHAR *errMsg, UINT errSize, UINT *sevIcon) { WCHAR szError[TEMP_BUF]; WCHAR szFacility[TEMP_BUF]; WCHAR szFormat[100]; IWbemStatusCodeText * pStatus = NULL; // initialize buffers. errMsg[0] = 0; szFacility[0] = 0; szError[0] = 0; HRESULT hr1 = CoInitialize(NULL); SCODE sc1 = CoCreateInstance(CLSID_WbemStatusCodeText, 0, CLSCTX_INPROC_SERVER, IID_IWbemStatusCodeText, (LPVOID *) &pStatus); // loaded OK? if(sc1 == S_OK) { BSTR bstr = 0; sc1 = pStatus->GetErrorCodeText(hr, 0, 0, &bstr); if(sc1 == S_OK) { _tcsncpy(szError, bstr, TEMP_BUF-1); SysFreeString(bstr); bstr = 0; } sc1 = pStatus->GetFacilityCodeText(hr, 0, 0, &bstr); if(sc1 == S_OK) { _tcsncpy(szFacility, bstr, TEMP_BUF-1); SysFreeString(bstr); bstr = 0; } // RELEASE pStatus->Release(); pStatus = NULL; } else { ::MessageBox(NULL, _T("WBEM error features not available. Upgrade WMI to a newer build."), _T("Internal Error"), MB_ICONSTOP|MB_OK); } // if not msgs returned.... if(wcslen(szFacility) == 0 || wcslen(szError) == 0) { // format the error nbr as a reasonable default. LoadString(GetModuleHandle(_T("MMFUtil.dll")), IDS_ERROR_UNKN_ERROR_FMT, szFormat, 99); _stprintf(errMsg, szFormat, hr); } else { // format a readable msg. LoadString(GetModuleHandle(_T("MMFUtil.dll")), IDS_ERROR_FMT, szFormat, 99); _stprintf(errMsg, szFormat, szFacility, szError); } // want an icon recommendation with that? if(sevIcon) { switch(SCODE_SEVERITY(hr)) { case 0: // - Success *sevIcon = MB_ICONINFORMATION; break; case 1: //- Failed *sevIcon = MB_ICONEXCLAMATION; break; } //endswitch severity } //endif sevIcon if(hr1 == S_OK) CoUninitialize(); return (SUCCEEDED(sc1) && SUCCEEDED(hr1)); }