2011-01-08 2 views

ответ

3

Вот как, например, следующая поиск кода ошибки в таблице сообщений системы и помещает отформатированный сообщение в 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. 
    } 
} 
+0

это работает, но у меня есть два вопроса: зачем мне бросать & ошибка в LPTSTR, когда я могу просто написать ошибку? И должен ли я освободить память с помощью LocalFree (Error)? – Stefano

+0

Потому что тогда вы передадите адрес указателя (который ожидает тип указателя на указатель) на другой указатель, и поскольку флаг FORMAT_MESSAGE_ALLOCATE_BUFFER' должен выделять буфер для сообщения, на которое указывает «Ошибка LPSTR». Вы должны освободить память, когда она больше не нужна. – cpx

+0

Новые приложения должны использовать ['HeapFree()'] (https://msdn.microsoft.com/en-us/library/aa366701 (v = vs.85) .aspx) вместо 'LocalFree()'. В этом случае вы хотите «HeapFree (GetProcessHeap(), 0, Error)». https://msdn.microsoft.com/en-us/library/aa366596(v=vs.85).aspx – Tim

Смежные вопросы