【发布时间】:2011-01-08 10:23:26
【问题描述】:
我在一个 win32 c++ 应用程序中使用了 winsock2。我将使用 MessageBox 显示可以通过调用 WSAGetLastError() 检索的网络错误。我怎样才能做到这一点?我看到了 FormatMessage 但我不明白如何使用它
【问题讨论】:
我在一个 win32 c++ 应用程序中使用了 winsock2。我将使用 MessageBox 显示可以通过调用 WSAGetLastError() 检索的网络错误。我怎样才能做到这一点?我看到了 FormatMessage 但我不明白如何使用它
【问题讨论】:
例如,下面是在系统的消息表中搜索错误代码并将格式化的消息放在LPTSTR Error缓冲区中。
// Create a reliable, stream socket using TCP.
if ((sockClient = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
{
DWORD err = GetLastError();
LPTSTR Error = 0;
if(FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
err,
0,
(LPTSTR)&Error,
0,
NULL) == 0)
{
// Failed in translating the error.
}
}
【讨论】:
FORMAT_MESSAGE_ALLOCATE_BUFFER 标志应该为 @ 指向的消息分配缓冲区987654326@。当不再需要内存时,您必须释放它。
HeapFree() 而不是LocalFree()。在这种情况下,您需要HeapFree(GetProcessHeap(), 0, Error)。 msdn.microsoft.com/en-us/library/aa366596(v=vs.85).aspx
【讨论】:
在 C++11 中,您可以使用:
std::system_category().message(WSAGetLastError());
将您的消息作为 std::string 获取并避免所有讨厌的缓冲区内容:)
请参阅 the function documentation 和 this answer that uses it to throw exceptions。
【讨论】: