19

FormatMessageをテストするためにこれを実行しています:

LPVOID lpMsgBuf;
errCode=12163;

FormatMessage(
    FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_SYSTEM ,
    0,
    errCode,
    0,
    (LPTSTR) &lpMsgBuf,
    0, NULL );

ただし、返されるときにlpMsgBufNULL が含まれています... ERROR_INTERNET_DISCONNECTEDのようなものを期待していました。

何かおかしくないですか?ありがとう。

4

1 に答える 1

30

これは 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 ドキュメントの「Handling Errors」セクションに公式に記載されています。

WinINet から発生したかどうかに関係なく、このルーチンをエラーに使用する場合は、フラグを元に戻すことができることに注意してください。そのフラグを配置するFORMAT_MESSAGE_FROM_SYSTEMと、エラーが見つからない場合にシステム メッセージ テーブルにフォールバックします。 wininet.dll。ただし、FORMAT_MESSAGE_IGNORE_INSERTS フラグは削除しないでくださいFormatMessage()

于 2010-01-29T02:22:48.467 に答える