Почему FormatMessage () не удающийся найти сообщение для ошибок WinINet?

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

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

15
задан Shog9 29 January 2010 в 02:36
поделиться

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 .

26
ответ дан 1 December 2019 в 02:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: