error_handling.hpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. /*
  2. * Copyright 2010 Vicente J. Botet Escriba
  3. * Copyright 2015 Andrey Semashev
  4. * Copyright 2016 Jorge Lodos
  5. *
  6. * Distributed under the Boost Software License, Version 1.0.
  7. * See http://www.boost.org/LICENSE_1_0.txt
  8. */
  9. #ifndef BOOST_WINAPI_ERROR_HANDLING_HPP_INCLUDED_
  10. #define BOOST_WINAPI_ERROR_HANDLING_HPP_INCLUDED_
  11. #include <stdarg.h>
  12. #include <boost/winapi/basic_types.hpp>
  13. #include <boost/winapi/get_last_error.hpp>
  14. #ifdef BOOST_HAS_PRAGMA_ONCE
  15. #pragma once
  16. #endif
  17. #if !defined( BOOST_USE_WINDOWS_H )
  18. extern "C" {
  19. #if !defined( BOOST_NO_ANSI_APIS )
  20. BOOST_SYMBOL_IMPORT boost::winapi::DWORD_ BOOST_WINAPI_WINAPI_CC
  21. FormatMessageA(
  22. boost::winapi::DWORD_ dwFlags,
  23. boost::winapi::LPCVOID_ lpSource,
  24. boost::winapi::DWORD_ dwMessageId,
  25. boost::winapi::DWORD_ dwLanguageId,
  26. boost::winapi::LPSTR_ lpBuffer,
  27. boost::winapi::DWORD_ nSize,
  28. va_list *Arguments);
  29. #endif
  30. BOOST_SYMBOL_IMPORT boost::winapi::DWORD_ BOOST_WINAPI_WINAPI_CC
  31. FormatMessageW(
  32. boost::winapi::DWORD_ dwFlags,
  33. boost::winapi::LPCVOID_ lpSource,
  34. boost::winapi::DWORD_ dwMessageId,
  35. boost::winapi::DWORD_ dwLanguageId,
  36. boost::winapi::LPWSTR_ lpBuffer,
  37. boost::winapi::DWORD_ nSize,
  38. va_list *Arguments);
  39. #if BOOST_WINAPI_PARTITION_DESKTOP || BOOST_WINAPI_PARTITION_SYSTEM
  40. BOOST_SYMBOL_IMPORT boost::winapi::UINT_ BOOST_WINAPI_WINAPI_CC
  41. SetErrorMode(boost::winapi::UINT_ uMode);
  42. #endif
  43. } // extern "C"
  44. #endif
  45. namespace boost {
  46. namespace winapi {
  47. #if defined( BOOST_USE_WINDOWS_H )
  48. #if BOOST_WINAPI_PARTITION_APP_SYSTEM
  49. BOOST_CONSTEXPR_OR_CONST DWORD_ FORMAT_MESSAGE_ALLOCATE_BUFFER_= FORMAT_MESSAGE_ALLOCATE_BUFFER;
  50. #endif
  51. BOOST_CONSTEXPR_OR_CONST DWORD_ FORMAT_MESSAGE_IGNORE_INSERTS_= FORMAT_MESSAGE_IGNORE_INSERTS;
  52. BOOST_CONSTEXPR_OR_CONST DWORD_ FORMAT_MESSAGE_FROM_STRING_= FORMAT_MESSAGE_FROM_STRING;
  53. BOOST_CONSTEXPR_OR_CONST DWORD_ FORMAT_MESSAGE_FROM_HMODULE_= FORMAT_MESSAGE_FROM_HMODULE;
  54. BOOST_CONSTEXPR_OR_CONST DWORD_ FORMAT_MESSAGE_FROM_SYSTEM_= FORMAT_MESSAGE_FROM_SYSTEM;
  55. BOOST_CONSTEXPR_OR_CONST DWORD_ FORMAT_MESSAGE_ARGUMENT_ARRAY_= FORMAT_MESSAGE_ARGUMENT_ARRAY;
  56. BOOST_CONSTEXPR_OR_CONST DWORD_ FORMAT_MESSAGE_MAX_WIDTH_MASK_= FORMAT_MESSAGE_MAX_WIDTH_MASK;
  57. BOOST_CONSTEXPR_OR_CONST WORD_ LANG_NEUTRAL_= LANG_NEUTRAL;
  58. BOOST_CONSTEXPR_OR_CONST WORD_ LANG_INVARIANT_= LANG_INVARIANT;
  59. BOOST_CONSTEXPR_OR_CONST WORD_ SUBLANG_DEFAULT_= SUBLANG_DEFAULT; // user default
  60. BOOST_FORCEINLINE BOOST_CONSTEXPR WORD_ MAKELANGID_(WORD_ p, WORD_ s) BOOST_NOEXCEPT
  61. {
  62. return MAKELANGID(p,s);
  63. }
  64. #if BOOST_WINAPI_PARTITION_DESKTOP
  65. BOOST_CONSTEXPR_OR_CONST DWORD_ SEM_FAILCRITICALERRORS_ = SEM_FAILCRITICALERRORS;
  66. BOOST_CONSTEXPR_OR_CONST DWORD_ SEM_NOGPFAULTERRORBOX_ = SEM_NOGPFAULTERRORBOX;
  67. BOOST_CONSTEXPR_OR_CONST DWORD_ SEM_NOALIGNMENTFAULTEXCEPT_ = SEM_NOALIGNMENTFAULTEXCEPT;
  68. BOOST_CONSTEXPR_OR_CONST DWORD_ SEM_NOOPENFILEERRORBOX_ = SEM_NOOPENFILEERRORBOX;
  69. #endif
  70. #else
  71. #if BOOST_WINAPI_PARTITION_APP_SYSTEM
  72. BOOST_CONSTEXPR_OR_CONST DWORD_ FORMAT_MESSAGE_ALLOCATE_BUFFER_= 0x00000100;
  73. #endif
  74. BOOST_CONSTEXPR_OR_CONST DWORD_ FORMAT_MESSAGE_IGNORE_INSERTS_= 0x00000200;
  75. BOOST_CONSTEXPR_OR_CONST DWORD_ FORMAT_MESSAGE_FROM_STRING_= 0x00000400;
  76. BOOST_CONSTEXPR_OR_CONST DWORD_ FORMAT_MESSAGE_FROM_HMODULE_= 0x00000800;
  77. BOOST_CONSTEXPR_OR_CONST DWORD_ FORMAT_MESSAGE_FROM_SYSTEM_= 0x00001000;
  78. BOOST_CONSTEXPR_OR_CONST DWORD_ FORMAT_MESSAGE_ARGUMENT_ARRAY_= 0x00002000;
  79. BOOST_CONSTEXPR_OR_CONST DWORD_ FORMAT_MESSAGE_MAX_WIDTH_MASK_= 0x000000FF;
  80. BOOST_CONSTEXPR_OR_CONST WORD_ LANG_NEUTRAL_= 0x00;
  81. BOOST_CONSTEXPR_OR_CONST WORD_ LANG_INVARIANT_= 0x7f;
  82. BOOST_CONSTEXPR_OR_CONST WORD_ SUBLANG_DEFAULT_= 0x01; // user default
  83. BOOST_FORCEINLINE BOOST_CONSTEXPR WORD_ MAKELANGID_(WORD_ p, WORD_ s) BOOST_NOEXCEPT
  84. {
  85. return (WORD_)((((WORD_)(s)) << 10) | (WORD_)(p));
  86. }
  87. #if BOOST_WINAPI_PARTITION_DESKTOP
  88. BOOST_CONSTEXPR_OR_CONST DWORD_ SEM_FAILCRITICALERRORS_ = 0x0001;
  89. BOOST_CONSTEXPR_OR_CONST DWORD_ SEM_NOGPFAULTERRORBOX_ = 0x0002;
  90. BOOST_CONSTEXPR_OR_CONST DWORD_ SEM_NOALIGNMENTFAULTEXCEPT_ = 0x0004;
  91. BOOST_CONSTEXPR_OR_CONST DWORD_ SEM_NOOPENFILEERRORBOX_ = 0x8000;
  92. #endif
  93. #endif
  94. #if !defined( BOOST_NO_ANSI_APIS )
  95. using ::FormatMessageA;
  96. #endif
  97. using ::FormatMessageW;
  98. #if BOOST_WINAPI_PARTITION_DESKTOP || BOOST_WINAPI_PARTITION_SYSTEM
  99. using ::SetErrorMode;
  100. #endif
  101. #if !defined( BOOST_NO_ANSI_APIS )
  102. BOOST_FORCEINLINE DWORD_ format_message(
  103. DWORD_ dwFlags,
  104. LPCVOID_ lpSource,
  105. DWORD_ dwMessageId,
  106. DWORD_ dwLanguageId,
  107. LPSTR_ lpBuffer,
  108. DWORD_ nSize,
  109. va_list *Arguments)
  110. {
  111. return ::FormatMessageA(dwFlags, lpSource, dwMessageId, dwLanguageId, lpBuffer, nSize, Arguments);
  112. }
  113. #endif
  114. BOOST_FORCEINLINE DWORD_ format_message(
  115. DWORD_ dwFlags,
  116. LPCVOID_ lpSource,
  117. DWORD_ dwMessageId,
  118. DWORD_ dwLanguageId,
  119. LPWSTR_ lpBuffer,
  120. DWORD_ nSize,
  121. va_list *Arguments)
  122. {
  123. return ::FormatMessageW(dwFlags, lpSource, dwMessageId, dwLanguageId, lpBuffer, nSize, Arguments);
  124. }
  125. }
  126. }
  127. #endif // BOOST_WINAPI_ERROR_HANDLING_HPP_INCLUDED_