Why is FormatMessage() failing to find a message for WinINet errors?

后端 未结 1 1136
耶瑟儿~
耶瑟儿~ 2020-12-06 10:30

I\'m running this to test FormatMessage:

LPVOID lpMsgBuf;
errCode=12163;

FormatMessage(
    FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_SYSTEM         


        
1条回答
  •  有刺的猬
    2020-12-06 10:56

    That's a WinINet error, and so the message associated with it lives in WinINet.dll. You just need to tell FormatMessage() about this in order for it to retrieve the correct message:

    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 );
    

    This is officially documented on MSDN under the "Handling Errors" section of the WinINet documentation.

    Note that you can add the FORMAT_MESSAGE_FROM_SYSTEM flag back in if you want to use this routine for errors that may or may not have come from WinINet: with that flag in place, FormatMessage() will fall back on the system message table if the error isn't found in wininet.dll. However, do not remove the FORMAT_MESSAGE_IGNORE_INSERTS flag.

    0 讨论(0)
提交回复
热议问题