diff --git a/include/boost/system/detail/system_category_win32.hpp b/include/boost/system/detail/system_category_win32.hpp index ff07ac2..2035678 100644 --- a/include/boost/system/detail/system_category_win32.hpp +++ b/include/boost/system/detail/system_category_win32.hpp @@ -13,6 +13,7 @@ #include #include #include +#include // @@ -25,6 +26,35 @@ namespace system namespace detail { +#if defined(_MSC_VER) && _MSC_VER < 1900 + +inline char const * unknown_message_win32( int ev, char * buffer, std::size_t len ) +{ +# if defined( BOOST_MSVC ) +# pragma warning( push ) +# pragma warning( disable: 4996 ) +# endif + + _snprintf( buffer, len - 1, "Unknown error (%d)", ev ); + + buffer[ len - 1 ] = 0; + return buffer; + +# if defined( BOOST_MSVC ) +# pragma warning( pop ) +# endif +} + +#else + +inline char const * unknown_message_win32( int ev, char * buffer, std::size_t len ) +{ + std::snprintf( buffer, len, "Unknown error (%d)", ev ); + return buffer; +} + +#endif + inline char const * system_category_message_win32( int ev, char * buffer, std::size_t len ) BOOST_NOEXCEPT { if( len == 0 ) @@ -62,14 +92,14 @@ inline char const * system_category_message_win32( int ev, char * buffer, std::s if( retval == 0 ) { - return "Unknown error"; + return unknown_message_win32( ev, buffer, len ); } int r = boost::winapi::WideCharToMultiByte( CP_ACP_, 0, wbuffer, -1, buffer, static_cast( len ), NULL, NULL ); if( r == 0 ) { - return "Unknown error"; + return unknown_message_win32( ev, buffer, len ); } --r; // exclude null terminator @@ -97,11 +127,17 @@ struct local_free } }; +inline std::string unknown_message_win32( int ev ) +{ + char buffer[ 38 ]; + return unknown_message_win32( ev, buffer, sizeof( buffer ) ); +} + inline std::string system_category_message_win32( int ev ) { using namespace boost::winapi; - void * lpMsgBuf = 0; + wchar_t * lpMsgBuf = 0; DWORD_ retval = boost::winapi::FormatMessageW( FORMAT_MESSAGE_ALLOCATE_BUFFER_ | FORMAT_MESSAGE_FROM_SYSTEM_ | FORMAT_MESSAGE_IGNORE_INSERTS_, @@ -113,20 +149,27 @@ inline std::string system_category_message_win32( int ev ) NULL ); - local_free lf_ = { lpMsgBuf }; - if( retval == 0 ) { - return "Unknown error"; + return unknown_message_win32( ev ); } - std::string buffer( retval * 2 + 1, char() ); + local_free lf_ = { lpMsgBuf }; - int r = boost::winapi::WideCharToMultiByte( CP_ACP_, 0, static_cast( lpMsgBuf ), -1, &buffer[0], static_cast( buffer.size() ), NULL, NULL ); + int r = boost::winapi::WideCharToMultiByte( CP_ACP_, 0, lpMsgBuf, -1, 0, 0, NULL, NULL ); if( r == 0 ) { - return "Unknown error"; + return unknown_message_win32( ev ); + } + + std::string buffer( r, char() ); + + r = boost::winapi::WideCharToMultiByte( CP_ACP_, 0, lpMsgBuf, -1, &buffer[0], r, NULL, NULL ); + + if( r == 0 ) + { + return unknown_message_win32( ev ); } --r; // exclude null terminator diff --git a/test/system_category_test.cpp b/test/system_category_test.cpp index 663fae7..f6aa615 100644 --- a/test/system_category_test.cpp +++ b/test/system_category_test.cpp @@ -14,6 +14,7 @@ #include #include #include +#include // @@ -51,7 +52,10 @@ std::string sys_strerror( int ev ) if( retval == 0 ) { - return "Unknown error"; + char buffer[ 38 ]; + + std::sprintf( buffer, "Unknown error (%d)", ev ); + return buffer; } std::string str( static_cast( lpMsgBuf ) );