diff --git a/src/lib/arch/win32/XArchWindows.cpp b/src/lib/arch/win32/XArchWindows.cpp index b0720f477..4fa6bb20f 100644 --- a/src/lib/arch/win32/XArchWindows.cpp +++ b/src/lib/arch/win32/XArchWindows.cpp @@ -7,24 +7,30 @@ */ #include "arch/win32/XArchWindows.h" -#include "base/String.h" -std::string windowsErrorToString(DWORD error) +#include + +QString windowsErrorToQString(DWORD error) { - char *cmsg; - if (FormatMessage( - FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM, 0, error, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&cmsg, 0, nullptr - ) == 0) { - cmsg = nullptr; - return deskflow::string::sprintf("Unknown error, code %d", error); + LPWSTR buffer = nullptr; // Using FORMAT_MESSAGE_ALLOCATE_BUFFER + DWORD size = FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, nullptr, error, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), reinterpret_cast(&buffer), 0, nullptr + ); + + if (size == 0) { + return QString("Unknown Windows error: %1").arg(error); } - std::string smsg(cmsg); - LocalFree(cmsg); - return smsg; + + QString message = QString::fromWCharArray(buffer, int(size)); + + // Gotcha: Was allocated by FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER) + LocalFree(buffer); + + return QString("[%1] %2").arg(error).arg(message.trimmed()); } -std::string winsockErrorToString(int error) +QString winsockErrorToQString(int error) { // built-in windows function for looking up error message strings // may not look up network error messages correctly. we'll have @@ -197,8 +203,19 @@ std::string winsockErrorToString(int error) for (unsigned int i = 0; s_netErrorCodes[i].m_code != 0; ++i) { if (s_netErrorCodes[i].m_code == error) { - return s_netErrorCodes[i].m_msg; + return QString("[%1] %2").arg(error).arg(s_netErrorCodes[i].m_msg); } } - return "Unknown error"; + + return QString("Unknown Winsock error: %1").arg(error); +} + +std::string windowsErrorToString(DWORD error) +{ + return windowsErrorToQString(error).toStdString(); +} + +std::string winsockErrorToString(int error) +{ + return winsockErrorToQString(error).toStdString(); } diff --git a/src/lib/arch/win32/XArchWindows.h b/src/lib/arch/win32/XArchWindows.h index 54933bd7e..00e3e1ab9 100644 --- a/src/lib/arch/win32/XArchWindows.h +++ b/src/lib/arch/win32/XArchWindows.h @@ -8,10 +8,13 @@ #pragma once +#include #include #define WIN32_LEAN_AND_MEAN #include +QString winsockErrorToQString(int error); +QString windowsErrorToQString(DWORD error); std::string winsockErrorToString(int error); std::string windowsErrorToString(DWORD error);