公式には、関数が成功しない限り、COM関数のパラメータ[out]
を使用しないでください。[out]
パラメータを使用できるかどうかを少なくとも3つの方法で確認できます。COMの[out]パラメータを使用することができますか?
は、次のインターフェイス
あなたがそれを使用して推薦する、次の方法のinterface IFoo : IUnknown {
HRESULT GetOtherFoo([out] IFoo** ppFoo);
HRESULT Bar();
};
を考えてみましょうか?
1.チェック戻り値
CComPtr<IFoo> other;
HRESULT hr = foo->GetOtherFoo(&other);
if (SUCCEEDED(hr))
other->Bar();
IFoo
のバグがNULL
ポインタデリファレンスを引き起こす可能性があるので、これは私には少し神経質になります。
2.チェック出力パラメータこれは、メソッドが失敗した場合、パラメータが変更された場合、それは[out]
パラメータのいずれかを(変更してはならないという事実に依存
< ==>それはそれを使用しても安全です)。この種のは、とにかく起こること
CComPtr<IFoo> other;
foo->GetOtherFoo(&other);
if (other)
other->Bar();
は注意ポインタがそう、それはゴミすることはできませんNULL
ない場合は、CComPtr
のデストラクタはRelease
を呼び出します。
3.偏執的な方法、これは私の意見では少し冗長です両方
CComPtr<IFoo> other;
HRESULT hr = foo->GetOtherFoo(&other);
if (SUCCEEDED(hr) && other)
other->Bar();
をご確認ください。
P.S. related questionを参照してください。