通常のCOM手順に従うには、エラーが発生するたびに、次のことを行う必要があります。
HRESULTwithまたは同様のものをチェックしてFAILED、エラーが発生したかどうかを確認します。IErrorInfo(通常CComPtr<IErrorInfo>)を保持する変数を作成します- を呼び出し
::GetErrorInfo(0, &var)ます。 - を呼び出して、人間が読める形式のバージョンを取得し
IErrorInfo::GetDescriptionます。 - をに変換
BSTRしstd::wstringます。 std::wstringを何らかの形式に変換しchar const*ます。std::exception上記のビット1、5、および6を公開する派生するユーザー定義の例外タイプをスローします。
これはすべて、COMのほとんどすべての関数呼び出しを回避する必要がある多くの定型文のようです。
MSVC ++コンパイラは、ATLやコンパイラ固有のCOM拡張機能など、COMを簡単に操作できるようにするためのさまざまな機能を提供していることは知っていますが_com_error、_com_raise_errorこれらの使用方法や、意図されているかどうかはわかりません。ユーザーコードで使用されます。
例外安全で競合状態の安全な方法でこの複雑さを管理するために使用される典型的な戦略はありますか?