2009-05-04 11 views
1

公式には、関数が成功しない限り、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を参照してください。

答えて

2

あなたがより多くの小切手を書いて、それをより信頼性の高いものにするために少し遅くするなら、オプション3があなたのためです。 COMサーバーにバグがあると予想しているので、それをチェックするのはかなり妥当です。

2

成功したHRESULTを返しますが、出力パラメータの一部をNULLに設定したCOMサーバーメソッドはあまり一般的ではありません。これが使われる場所はいくつかありますが(IClientSecurity :: QueryBlanketが思い付いています)、通常、メソッドが正常に返された場合、クライアントはすべての出力パラメータがNULLでないと予想します。

結局のところ、方法が文書化されている方法の問題です。しかし、デフォルトの場合、私は1.安全な方法であると考えています。

関連する問題