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