1. ホーム
  2. c++

[解決済み] C++でFormatMessage()を正しく使うにはどうしたらよいですか?

2023-03-03 13:05:15

質問

がなければ :

  • MFC
  • ATL

どのようにすれば FormatMessage() のエラーテキストを取得するには HRESULT ?

 HRESULT hresult = application.CreateInstance("Excel.Application");

 if (FAILED(hresult))
 {
     // what should i put here to obtain a human-readable
     // description of the error?
     exit (hresult);
 }

どのように解決するのですか?

ここでは、システムからエラーメッセージを受け取るための適切な方法を説明します。 HRESULT (この場合 hresult という名前ですが、これを GetLastError() ):

LPTSTR errorText = NULL;

FormatMessage(
   // use system message tables to retrieve error text
   FORMAT_MESSAGE_FROM_SYSTEM
   // allocate buffer on local heap for error text
   |FORMAT_MESSAGE_ALLOCATE_BUFFER
   // Important! will fail otherwise, since we're not 
   // (and CANNOT) pass insertion parameters
   |FORMAT_MESSAGE_IGNORE_INSERTS,  
   NULL,    // unused with FORMAT_MESSAGE_FROM_SYSTEM
   hresult,
   MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
   (LPTSTR)&errorText,  // output 
   0, // minimum size for output buffer
   NULL);   // arguments - see note 
   
if ( NULL != errorText )
{
   // ... do something with the string `errorText` - log it, display it to the user, etc.

   // release memory allocated by FormatMessage()
   LocalFree(errorText);
   errorText = NULL;
}

David Hanak氏の回答との決定的な違いは、このように FORMAT_MESSAGE_IGNORE_INSERTS フラグの使用です。MSDN では、挿入をどのように使用すべきかが少し不明瞭ですが Raymond Chen は、決してそれらを使ってはいけないと指摘しています。 を使うべきでないと指摘しています。なぜなら、システムがどの挿入を期待しているのかを知る方法がないからです。

参考までに、もし Visual C++ を使っているのであれば、 を使うことで少し楽になります。 _com_error クラスを使用することです。

{
   _com_error error(hresult);
   LPCTSTR errorText = error.ErrorMessage();
   
   // do something with the error...

   //automatic cleanup when error goes out of scope
}

私が知る限りでは、MFCやATLの直接の一部ではありません。