Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

119 lines
2.8 KiB

  1. #include "StdAfx.h"
  2. #include "exceptions.h"
  3. void CBaseException::FormatError( UINT nResID, DWORD dwCode )
  4. {
  5. WCHAR wszBuffer[ MaxErrorBuff ] = L"";
  6. VERIFY( ::LoadStringW( _Module.GetModuleInstance(), nResID, wszBuffer, MaxErrorBuff ) );
  7. FormatError( wszBuffer, dwCode );
  8. }
  9. void CBaseException::FormatError( LPCWSTR wszError, DWORD dwCode )
  10. {
  11. _ASSERT( wszError != NULL );
  12. WCHAR wszBuffer1[ MaxErrorBuff ] = L"";
  13. WCHAR wszOSError[ MaxErrorBuff ] = L"";
  14. ::wcsncpy( wszBuffer1, wszError, MaxErrorBuff );
  15. // Get the OS error info
  16. if ( dwCode != ERROR_SUCCESS )
  17. {
  18. WCHAR wszFmt[ MaxErrorBuff ] = L"";
  19. // Load format string from resources
  20. VERIFY( ::LoadStringW( _Module.GetModuleInstance(), IDS_FMO_ERROR, wszFmt, MaxErrorBuff ) );
  21. // For E_FAIL use ErrorInfo
  22. if ( dwCode != E_FAIL )
  23. {
  24. VERIFY( ::FormatMessageW( FORMAT_MESSAGE_FROM_SYSTEM,
  25. NULL,
  26. dwCode,
  27. 0,
  28. wszOSError,
  29. MaxErrorBuff,
  30. NULL ) != 0 );
  31. }
  32. else
  33. {
  34. IErrorInfoPtr spErrorInfo;
  35. CComBSTR bstrError;
  36. VERIFY( SUCCEEDED( ::GetErrorInfo( 0, &spErrorInfo ) ) );
  37. VERIFY( SUCCEEDED( spErrorInfo->GetDescription( &bstrError ) ) );
  38. ::wcsncpy( wszOSError, bstrError, MaxErrorBuff - 1 );
  39. wszOSError[ MaxErrorBuff - 1 ] = L'\0';
  40. }
  41. _ASSERT( ( ::wcslen( wszError ) + ::wcslen( wszOSError ) + ::wcslen( wszFmt ) ) < MaxErrorBuff );
  42. // Build the final error msg
  43. ::_snwprintf( wszBuffer1,
  44. MaxErrorBuff - ::wcslen( wszFmt ),
  45. wszFmt,
  46. wszError,
  47. wszOSError );
  48. }
  49. try
  50. {
  51. m_strError = wszBuffer1;
  52. }
  53. catch(...)
  54. {
  55. // Out of memory - nothing to do
  56. }
  57. ATLTRACE( L"\nException occured: %s", wszBuffer1 );
  58. }
  59. // CObjectException implementation
  60. CObjectException::CObjectException( UINT nResID, LPCWSTR wszObject, DWORD dwCode /*=GetLastError()*/ )
  61. {
  62. WCHAR wszFmt[ MaxErrorBuff ] = L"";
  63. WCHAR wszError[ MaxErrorBuff ] = L"";
  64. VERIFY( ::LoadStringW( _Module.GetModuleInstance(), nResID, wszFmt, MaxErrorBuff ) );
  65. _ASSERT( ( ::wcslen( wszObject ) + ::wcslen( wszFmt ) ) < MaxErrorBuff );
  66. ::swprintf( wszError, wszFmt, wszObject );
  67. CBaseException::FormatError( wszError, dwCode );
  68. }
  69. CObjectException::CObjectException( UINT nResID,
  70. LPCWSTR wszObject1,
  71. LPCWSTR wszObject2,
  72. DWORD dwCode /*= ::GetLastError()*/ )
  73. {
  74. WCHAR wszFmt[ CBaseException::MaxErrorBuff ] = L"";
  75. WCHAR wszError[ CBaseException::MaxErrorBuff ] = L"";
  76. VERIFY( ::LoadStringW( _Module.GetModuleInstance(), nResID, wszFmt, MaxErrorBuff ) );
  77. _ASSERT( ( ::wcslen( wszObject2 ) + ::wcslen( wszObject1 ) + ::wcslen( wszFmt ) ) < CBaseException::MaxErrorBuff );
  78. ::swprintf( wszError, wszFmt, wszObject1, wszObject2 );
  79. CBaseException::FormatError( wszError, dwCode );
  80. }