为什么FormatMessage()无法找到WinINet错误的消息?

时间:2010-01-29 02:13:43

标签: c windows winapi wininet formatmessage

我正在运行它来测试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 个答案:

答案 0 :(得分:26)

这是一个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 );

这是在WinDNet文档的"Handling Errors" section下在MSDN上正式记录的。

请注意,如果您希望将此例程用于可能或可能 来自WinINet的错误,您可以重新添加FORMAT_MESSAGE_FROM_SYSTEM标志:使用该标志,{如果在wininet.dll中找不到错误,{1}}将回退到系统消息表。但是,do not remove the FORMAT_MESSAGE_IGNORE_INSERTS flag