Почему FormatMessage () не может найти сообщение об ошибках WinINet? - PullRequest
15 голосов
/ 29 января 2010

Я запускаю это для проверки 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 .

Что-то выглядит не так? Спасибо.

1 Ответ

26 голосов
/ 29 января 2010

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

FormatMessage( 
   // flags:
   FORMAT_MESSAGE_ALLOCATE_BUFFER  // allocate buffer (free with LocalFree())
   | FORMAT_MESSAGE_IGNORE_INSERTS // don't process inserts
   <b>| FORMAT_MESSAGE_FROM_HMODULE,  // retrieve message from specified DLL</b>
   // module to retrieve message text from
   <b>GetModuleHandle(_T("wininet.dll")),</b>
   // 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 .

...