2010-08-03 36 views
21

Tôi đang chuyển một số mã ổ cắm từ Linux sang Windows.Làm cách nào để truy xuất chuỗi lỗi từ WSAGetLastError()?

Trong Linux, tôi có thể sử dụng strerror() để chuyển đổi mã errno thành chuỗi có thể đọc được.

Tài liệu MSDN hiển thị các chuỗi tương đương cho mỗi mã lỗi được trả lại từ WSAGetLastError(), nhưng tôi không thấy bất kỳ điều gì về cách truy xuất các chuỗi đó. Liệu strerror() có hoạt động ở đây không?

Tôi làm cách nào để truy xuất chuỗi lỗi có thể đọc được từ Winsock?

Trả lời

14

Khi tài liệu cho WSAGetLastError cho biết bạn có thể sử dụng FormatMessage để nhận phiên bản văn bản của thông báo lỗi.

Bạn cần đặt FORMAT_MESSAGE_FROM_SYSTEM trong thông số dwFlags và chuyển mã lỗi làm thông số dwMessage.

+1

Cảm ơn - Tôi vừa phát hiện ra rằng bản thân mình. Tôi cần phải nhớ để xem MSDN trực tuyến (so với bản sao off-line được cài đặt trên máy tính xách tay của tôi!). –

27
wchar_t *s = NULL; 
FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 
       NULL, WSAGetLastError(), 
       MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
       (LPWSTR)&s, 0, NULL); 
fprintf(stderr, "%S\n", s); 
LocalFree(s); 
+2

Đối số '& s' phải được đúc thành LPTSTR ở đây vì hàm này sử dụng một hack ở đây với tham số này trả về một con trỏ tới chuỗi dưới dạng chuỗi. –

+1

Chỉ khi bạn cũng thay đổi FormatMessageW thành FormatMessage. Nếu không, bạn có thể cần phải truyền thay cho LPWSTR, tùy thuộc vào các cài đặt trong dự án Visual Studio của bạn. –

+0

Tôi đã chỉnh sửa câu trả lời để đưa diễn viên vào 'LPWSTR', nếu không trình biên dịch không thành công – SailAvid

2

Một phiên bản hơi đơn giản của câu trả lời mxcl, mà loại bỏ sự cần thiết của malloc/miễn phí và những rủi ro tiềm ẩn trong đó, và đó xử lý các trường hợp không có văn bản thông báo hiện có sẵn (vì Microsoft không ghi lại những gì xảy ra sau đó):

int 
    err; 

char 
    msgbuf [256]; // for a message up to 255 bytes. 


msgbuf [0] = '\0'; // Microsoft doesn't guarantee this on man page. 

err = WSAGetLastError(); 

FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, // flags 
       NULL,    // lpsource 
       err,     // message id 
       MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), // languageid 
       msgbuf,    // output buffer 
       sizeof (msgbuf),  // size of msgbuf, bytes 
       NULL);    // va_list of arguments 

if (! *msgbuf) 
    sprintf (msgbuf, "%d", err); // provide error # if no string available 
Các vấn đề liên quan