Почему 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.

Что-то выглядит не так? Благодарю.

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.

Другие вопросы по тегам