atlexcept.h
上传用户:hfwmdy
上传日期:2016-01-14
资源大小:83k
文件大小:3k
源码类别:

GDI/图象编程

开发平台:

Visual C++

  1. // This is a part of the Active Template Library.
  2. // Copyright (C) Microsoft Corporation
  3. // All rights reserved.
  4. //
  5. // This source code is only intended as a supplement to the
  6. // Active Template Library Reference and related
  7. // electronic documentation provided with the library.
  8. // See these sources for detailed information regarding the
  9. // Active Template Library product.
  10. #ifndef __ATLEXCEPT_H__
  11. #define __ATLEXCEPT_H__
  12. #pragma once
  13. #include <atldef.h>
  14. #include <atltrace.h>
  15. #pragma pack(push,_ATL_PACKING)
  16. namespace ATL
  17. {
  18. /////////////////////////////////////////////////////////////////////////////
  19. // Exception raise (for functions that cannot return an error code)
  20. inline void __declspec(noreturn) _AtlRaiseException( DWORD dwExceptionCode, DWORD dwExceptionFlags = EXCEPTION_NONCONTINUABLE )
  21. {
  22. RaiseException( dwExceptionCode, dwExceptionFlags, 0, NULL );
  23. }
  24. class CAtlException
  25. {
  26. public:
  27. CAtlException() throw() :
  28. m_hr( E_FAIL )
  29. {
  30. }
  31. CAtlException( HRESULT hr ) throw() :
  32. m_hr( hr )
  33. {
  34. }
  35. operator HRESULT() const throw()
  36. {
  37. return( m_hr );
  38. }
  39. public:
  40. HRESULT m_hr;
  41. };
  42. #ifndef _ATL_NO_EXCEPTIONS
  43. // Throw a CAtlException with the given HRESULT
  44. #if defined( _ATL_CUSTOM_THROW )  // You can define your own AtlThrow to throw a custom exception.
  45. #ifdef _AFX
  46. #error MFC projects must use default implementation of AtlThrow()
  47. #endif
  48. #else
  49. ATL_NOINLINE __declspec(noreturn) inline void WINAPI AtlThrowImpl( HRESULT hr )
  50. {
  51. ATLTRACE(atlTraceException, 0, _T("AtlThrow: hr = 0x%xn"), hr );
  52. #ifdef _AFX
  53. if( hr == E_OUTOFMEMORY )
  54. {
  55. AfxThrowMemoryException();
  56. }
  57. else
  58. {
  59. AfxThrowOleException( hr );
  60. }
  61. #else
  62. throw CAtlException( hr );
  63. #endif
  64. };
  65. #endif
  66. // Throw a CAtlException corresponding to the result of ::GetLastError
  67. ATL_NOINLINE __declspec(noreturn) inline void WINAPI AtlThrowLastWin32()
  68. {
  69. DWORD dwError = ::GetLastError();
  70. AtlThrow( HRESULT_FROM_WIN32( dwError ) );
  71. }
  72. #else  // no exception handling
  73. // Throw a CAtlException with th given HRESULT
  74. #if !defined( _ATL_CUSTOM_THROW )  // You can define your own AtlThrow
  75. ATL_NOINLINE inline void WINAPI AtlThrowImpl( HRESULT hr )
  76. {
  77. ATLTRACE(atlTraceException, 0, _T("AtlThrow: hr = 0x%xn"), hr );
  78. ATLASSERT( false );
  79. DWORD dwExceptionCode;
  80. switch(hr)
  81. {
  82. case E_OUTOFMEMORY:
  83. dwExceptionCode = STATUS_NO_MEMORY;
  84. break;
  85. default:
  86. dwExceptionCode = EXCEPTION_ILLEGAL_INSTRUCTION;
  87. }
  88. _AtlRaiseException((DWORD)dwExceptionCode);
  89. }
  90. #endif
  91. // Throw a CAtlException corresponding to the result of ::GetLastError
  92. ATL_NOINLINE inline void WINAPI AtlThrowLastWin32()
  93. {
  94. DWORD dwError = ::GetLastError();
  95. AtlThrow( HRESULT_FROM_WIN32( dwError ) );
  96. }
  97. #endif  // no exception handling
  98. };  // namespace ATL
  99. #pragma pack(pop)
  100. #endif  // __ATLEXCEPT_H__