Подтвердить что ты не робот

Почему FormatMessage() не смог найти сообщение об ошибках WinINet?

Я запускаю это, чтобы проверить FormatMessage:

LPVOID lpMsgBuf;
errCode=12163;

FormatMessage(
    FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_SYSTEM ,
    0,
    errCode,
    0,
    (LPTSTR) &lpMsgBuf,
    0, NULL );

Однако, когда он возвращает lpMsgBuf, содержит NULL... Я ожидал чего-то вроде ERROR_INTERNET_DISCONNECTED.

Все выглядит неправильно? Спасибо.

4b9b3361

Ответ 1

Это ошибка WinINet, поэтому связанное с ней сообщение находится в WinINet.dll. Вам просто нужно сообщить FormatMessage() об этом, чтобы получить правильное сообщение:

FormatMessage( 
   // flags:
   FORMAT_MESSAGE_ALLOCATE_BUFFER  // allocate buffer (free with LocalFree())
   | FORMAT_MESSAGE_IGNORE_INSERTS // don't process inserts
   | FORMAT_MESSAGE_FROM_HMODULE,  // retrieve message from specified DLL
   // module to retrieve message text from
   GetModuleHandle(_T("wininet.dll")),
   // error code to look up
   errCode,
   // default language
   0, 
   // address of location to hold pointer to allocated buffer
   (LPTSTR)&lpMsgBuf, 
   // no minimum size
   0, 
   // no arguments
   NULL );

Это официально зарегистрировано в MSDN в разделе "Обработка ошибок" документации WinINet.

Обратите внимание, что вы можете добавить флаг FORMAT_MESSAGE_FROM_SYSTEM, если вы хотите использовать эту подпрограмму для ошибок, которые могут появляться или не появляться из WinINet: с этим флажком, FormatMessage() будет возвращаться к системному сообщению если ошибка не найдена в wininet.dll. Однако не удалять флаг FORMAT_MESSAGE_IGNORE_INSERTS.