は、何らかのエラーが発生したとき、人は次のことを行う必要があり、典型的なCOMの手順に従ってください:C++でCOMを呼び出すと、どのようにエラーをラップしますか?
- チェック
FAILED
または類似とHRESULT
、エラーが発生したかどうかを確認します。 IErrorInfo
(通常CComPtr<IErrorInfo>
)- コール
::GetErrorInfo(0, &var)
を保持する変数を作成します。 - Get the human readable version of that by calling
IErrorInfo::GetDescription
. - を
std::wstring
に変換します。 std::wstring
をchar const*
の形式に変換します。std::exception
から派生し、上記のビット1,5、および6を公開するユーザー定義の例外タイプをスローします。
これは、すべてCOMのほぼすべての関数呼び出しの周りを移動しなければならない定型文のようです。
私はMSVC++コンパイラが、ATLやコンパイラ固有のCOM拡張子_com_error
、_com_raise_error
などのようなCOMを使いこなすのを簡単にするためにたくさんのものを提供していることは知っていますが、それらがユーザコードによって使用されることさえ意図されていれば。
この複雑さを例外安全で競合状態に安全に管理するために使用される典型的な戦略はありますか?
#importディレクティブで始まり、残りは自動的に所定の場所に落ちます。 –
@HansPassant:対象のタイプライブラリがありません。 (私が持っているのは 'wbemidl.h'です) –
次にfuggedaboudid、あなたはあなた自身でそれをラップする必要があります。 CheckHR()関数を書くだけです。 –