windows-nt/Source/XPSP1/NT/admin/admt/common/commonlib/hrmsg.cpp

381 lines
7.3 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
/******************************************************************
* *
* CPP file for common error handling functions. *
* *
******************************************************************/
#ifdef USE_STDAFX
# include "stdafx.h"
# include "rpc.h"
#else
# include <windows.h>
#endif
#include "HrMsg.h"
#include <stdio.h>
#include <stdarg.h>
namespace HrMsg_cpp
{
void __stdcall AdmtThrowErrorImpl(const _com_error& ce, LPCTSTR pszDescription);
}
using namespace HrMsg_cpp;
//---------------------------------------------------------------------------
// GetError Helper Function
//---------------------------------------------------------------------------
_com_error GetError(HRESULT hr)
{
_com_error ce(hr);
IErrorInfo* pErrorInfo = NULL;
if (GetErrorInfo(0, &pErrorInfo) == S_OK)
{
ce = _com_error(FAILED(hr) ? hr : E_FAIL, pErrorInfo);
}
else
{
ce = _com_error(FAILED(hr) ? hr : S_OK);
}
return ce;
}
//-----------------------------------------------------------------------------
// Return text for hresults
//-----------------------------------------------------------------------------
_bstr_t __stdcall HResultToText2(HRESULT hr)
{
_bstr_t bstrError;
LPTSTR pszError = NULL;
try
{
switch (HRESULT_FACILITY(hr))
{
// case FACILITY_NULL: // 0
// case FACILITY_RPC: // 1
// case FACILITY_DISPATCH: // 2
// case FACILITY_STORAGE: // 3
case FACILITY_ITF: // 4
{
HMODULE hModule = LoadLibrary(_T("MSDAERR.dll"));
if (hModule)
{
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_HMODULE,
hModule,
hr,
0,
(LPTSTR)&pszError,
0,
NULL
);
FreeLibrary(hModule);
}
break;
}
case FACILITY_WIN32: // 7
{
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
hr,
0,
(LPTSTR)&pszError,
0,
NULL
);
break;
}
// case FACILITY_WINDOWS: // 8
// case FACILITY_SSPI: // 9
// case FACILITY_SECURITY: // 9
case FACILITY_CONTROL: // 10
{
HMODULE hModule = LoadLibrary(_T("MSADER15.dll"));
if (hModule)
{
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_HMODULE,
hModule,
hr,
0,
(LPTSTR)&pszError,
0,
NULL
);
FreeLibrary(hModule);
}
break;
}
// case FACILITY_CERT: // 11
// case FACILITY_INTERNET: // 12
// case FACILITY_MEDIASERVER: // 13
case FACILITY_MSMQ: // 14
{
HMODULE hModule = LoadLibrary(_T("MQUTIL.dll"));
if (hModule)
{
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_HMODULE,
hModule,
hr,
0,
(LPTSTR)&pszError,
0,
NULL
);
FreeLibrary(hModule);
}
break;
}
// case FACILITY_SETUPAPI: // 15
// case FACILITY_SCARD: // 16
// case FACILITY_COMPLUS: // 17
// case FACILITY_AAF: // 18
// case FACILITY_URT: // 19
// case FACILITY_ACS: // 20
default:
{
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
hr,
0,
(LPTSTR)&pszError,
0,
NULL
);
break;
}
}
if (pszError)
{
size_t cch = _tcslen(pszError);
if ((cch > 1) && (pszError[cch - 1] == _T('\n')))
{
pszError[cch - 1] = 0;
if (pszError[cch - 2] == _T('\r'))
{
pszError[cch - 2] = 0;
}
}
bstrError = pszError;
}
else
{
_TCHAR szError[32];
_stprintf(szError, _T("Unknown error 0x%08lX."), hr);
bstrError = szError;
}
}
catch (...)
{
;
}
if (pszError)
{
LocalFree((HLOCAL)pszError);
}
return bstrError;
}
_bstr_t FormatHRMsg(LPCTSTR pformatStr, HRESULT hr)
{
WCHAR sError[MAX_PATH];
_com_error ce = GetError(hr);
_bstr_t bstrDescription = ce.Description();
if (bstrDescription.length() > 0)
{
swprintf(sError, pformatStr, (WCHAR*)bstrDescription);
}
else
{
swprintf(sError, pformatStr, (WCHAR*)HResultToText(hr));
}
return sError;
}
_bstr_t __stdcall HResultToText(HRESULT hr)
{
return GetError(hr).Description();
}
//---------------------------------------------------------------------------
// AdmtThrowError
//
// Generates formatted error description and generates exception.
//
// 2000-??-?? Mark Oluper - initial
// 2001-02-13 Mark Oluper - moved to commonlib
//---------------------------------------------------------------------------
void __cdecl AdmtThrowError(_com_error ce, HINSTANCE hInstance, UINT uId, ...)
{
_TCHAR szFormat[512];
_TCHAR szDescription[1024];
if (LoadString(hInstance, uId, szFormat, 512))
{
va_list args;
va_start(args, uId);
_vsntprintf(szDescription, sizeof(szDescription) / sizeof(szDescription[0]), szFormat, args);
va_end(args);
}
else
{
szDescription[0] = _T('\0');
}
AdmtThrowErrorImpl(ce, szDescription);
}
void __cdecl AdmtThrowError(_com_error ce, LPCTSTR pszFormat, ...)
{
_TCHAR szDescription[1024];
if (pszFormat)
{
va_list args;
va_start(args, pszFormat);
_vsntprintf(szDescription, sizeof(szDescription) / sizeof(szDescription[0]), pszFormat, args);
va_end(args);
}
else
{
szDescription[0] = _T('\0');
}
AdmtThrowErrorImpl(ce, szDescription);
}
namespace HrMsg_cpp
{
//---------------------------------------------------------------------------
// AdmtThrowErrorImpl
//
// Concatenates rich error information and throws exception.
//
// 2000-??-?? Mark Oluper - initial
// 2001-02-13 Mark Oluper - moved to commonlib
//---------------------------------------------------------------------------
void __stdcall AdmtThrowErrorImpl(const _com_error& ce, LPCTSTR pszDescription)
{
_bstr_t bstrNewDescription;
try
{
bstrNewDescription = pszDescription;
_bstr_t bstrSource = ce.Source();
if (bstrSource.length() > 0)
{
if (bstrNewDescription.length() > 0)
{
bstrNewDescription += _T(" : ");
}
bstrNewDescription += bstrSource;
}
_bstr_t bstrOldDescription = ce.Description();
if (bstrOldDescription.length() > 0)
{
if (bstrNewDescription.length() > 0)
{
if (bstrSource.length() > 0)
{
bstrNewDescription += _T(": ");
}
else
{
bstrNewDescription += _T(" ");
}
}
bstrNewDescription += bstrOldDescription;
}
else
{
LPCTSTR pszErrorMessage = ce.ErrorMessage();
if (pszErrorMessage)
{
if (bstrNewDescription.length() > 0)
{
bstrNewDescription += _T(" : ");
}
bstrNewDescription += pszErrorMessage;
}
}
}
catch (...)
{
;
}
ICreateErrorInfoPtr spCreateErrorInfo;
CreateErrorInfo(&spCreateErrorInfo);
if (spCreateErrorInfo)
{
// LPOLESTR pszProgId;
// if (ProgIDFromCLSID(clsid, &pszProgId) == S_OK)
// {
// spCreateErrorInfo->SetSource(pszProgId);
// CoTaskMemFree(pszProgId);
// }
// else
// {
spCreateErrorInfo->SetSource(L"");
// }
// spCreateErrorInfo->SetGUID(iid);
spCreateErrorInfo->SetGUID(GUID_NULL);
spCreateErrorInfo->SetDescription(bstrNewDescription);
spCreateErrorInfo->SetHelpFile(L"");
spCreateErrorInfo->SetHelpContext(0);
}
_com_raise_error(ce.Error(), IErrorInfoPtr(spCreateErrorInfo).Detach());
}
} // namespace