ErrorFormatter.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #ifndef __ErrorFormatter_h__
  2. #define __ErrorFormatter_h__
  3. /////////////////////////////////////////////////////////////////////////////
  4. // ErrorFormatter.h : Declaration of the TCErrorFormatter class template and
  5. // of TCErrorFormatterBase from which it is derived.
  6. //
  7. /////////////////////////////////////////////////////////////////////////////
  8. // TCErrorFormatterBase
  9. //
  10. class ATL_NO_VTABLE TCErrorFormatterBase
  11. {
  12. // Implementation
  13. public:
  14. static HRESULT FormattedErrorV(REFCLSID clsid, REFIID iid, UINT idFmt,
  15. va_list argptr)
  16. {
  17. // Load the formatting string
  18. TCHAR szFmt[_MAX_PATH * 2];
  19. if (!LoadString(_Module.GetResourceInstance(), idFmt, szFmt,
  20. sizeofArray(szFmt)))
  21. return E_UNEXPECTED;
  22. // Format the string
  23. TCHAR szText[_MAX_PATH * 4];
  24. if (-1 == _vsntprintf(szText, sizeofArray(szText), szFmt, argptr))
  25. return E_OUTOFMEMORY;
  26. // Delegate to the Atl method
  27. return AtlReportError(clsid, szText, iid, MAKE_HRESULT(1, FACILITY_ITF,
  28. idFmt));
  29. }
  30. static HRESULT FormattedBSTRV(BSTR* pbstr, UINT idFmt, va_list argptr)
  31. {
  32. // Do nothing if the specified [out] parameter is NULL
  33. if (!pbstr)
  34. return S_OK;
  35. // Load the formatting string (always in Unicode under NT)
  36. LPCWSTR pszFmt;
  37. #if !defined(_UNICODE) && !defined(UNICODE)
  38. if (IsWin9x())
  39. {
  40. char szFmt[_MAX_PATH * 2];
  41. if (!LoadString(_Module.GetResourceInstance(), idFmt, szFmt,
  42. sizeof(szFmt)))
  43. return E_UNEXPECTED;
  44. USES_CONVERSION;
  45. pszFmt = A2CW(szFmt);
  46. }
  47. else
  48. #endif
  49. {
  50. WCHAR szFmt[_MAX_PATH * 2];
  51. if (!LoadStringW(_Module.GetResourceInstance(), idFmt, szFmt,
  52. sizeofArray(szFmt)))
  53. return E_UNEXPECTED;
  54. pszFmt = szFmt;
  55. }
  56. // Format the string
  57. WCHAR szText[_MAX_PATH * 4];
  58. int cch = _vsnwprintf(szText, sizeofArray(szText), pszFmt, argptr);
  59. if (-1 == cch)
  60. return E_OUTOFMEMORY;
  61. // Allocate a BSTR
  62. CComBSTR bstr(cch, szText);
  63. CLEAROUT(pbstr, (BSTR)bstr);
  64. return S_OK;
  65. }
  66. };
  67. /////////////////////////////////////////////////////////////////////////////
  68. // TCErrorFormatter<T, const IID*>
  69. //
  70. template <class T, const IID* piid>
  71. class ATL_NO_VTABLE TCErrorFormatter :
  72. protected TCErrorFormatterBase
  73. {
  74. // Operations
  75. public:
  76. HRESULT FormattedError(UINT idFmt, ...)
  77. {
  78. va_list argptr;
  79. va_start(argptr, idFmt);
  80. HRESULT hr = TCErrorFormatterBase::FormattedErrorV(
  81. static_cast<T*>(this)->GetObjectCLSID(), *piid, idFmt, argptr);
  82. va_end(argptr);
  83. return hr;
  84. }
  85. HRESULT FormattedErrorIID(REFIID iid, UINT idFmt, ...)
  86. {
  87. va_list argptr;
  88. va_start(argptr, idFmt);
  89. HRESULT hr = TCErrorFormatterBase::FormattedErrorV(
  90. static_cast<T*>(this)->GetObjectCLSID(), iid, idFmt, argptr);
  91. va_end(argptr);
  92. return hr;
  93. }
  94. static HRESULT FormattedBSTR(BSTR* pbstr, UINT idFmt, ...)
  95. {
  96. va_list argptr;
  97. va_start(argptr, idFmt);
  98. HRESULT hr = TCErrorFormatterBase::FormattedBSTRV(pbstr, idFmt, argptr);
  99. va_end(argptr);
  100. return hr;
  101. }
  102. };
  103. /////////////////////////////////////////////////////////////////////////////
  104. #endif // !__ErrorFormatter_h__