Я выполняю это для тестирования FormatMessage:
LPVOID lpMsgBuf;
errCode=12163;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM ,
0,
errCode,
0,
(LPTSTR) &lpMsgBuf,
0, NULL );
Однако, когда это возвращается lpMsgBuf
содержит ПУСТОЙ УКАЗАТЕЛЬ... Я ожидал что-то как ERROR_INTERNET_DISCONNECTED.
Что-нибудь выглядит неправильным? Спасибо.
Это ошибка 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 .