1

IUnknown::QueryInterface() には、取得したインターフェースを置くアドレスを示す void** パラメータが渡されます。

STDMETHOD QueryInterface(/* [in] */ REFIID riid, /* [iid_is][out] */ void** ppvObject)

QueryInterface() の実装は、このポインターが null であることを確認する (そしてすぐに E_POINTER を返す) べきか、それとも単にそこに書き込むべきか?

COM 関連のコードをたくさん見てきましたが、ほとんどどこでもチェックが実行されていません。仮説的には、もちろん誰かがこのパラメーターとして null ポインターを渡すことができますが、そのようなチェックは本当に必要ですか?

4

3 に答える 3

4

あなた (呼び出し元) は、ポインタが ではないことを確認する必要はありませんNULL

ただし、返された を確認する必要がありますHRESULTE_POINTER出力ポインタがサポートされていない場合、NULLおよびE_NOINTERFACEインターフェイスがサポートされていない場合、メソッドは戻ります。


呼び出し先は、ポインターが存在しないことを確認し、存在する場合はNULL返す必要があります。E_POINTERNULL

MSDN : 戻り値:

このメソッドはS_OK、インターフェースがサポートされているかどうかを返しますE_NOINTERFACEppvObjectである場合NULL、このメソッドは を返しますE_POINTER

于 2009-09-15T10:47:21.643 に答える
1

MSDN docsによると、QueryInterface は S_OK を返します。この場合、out パラメータは正しく設定されます。または、E_NOINTERFACE を返します。この場合、out パラメータは設定されません。

渡した void** が NULL の場合、E_POINTER が返されます。

null をチェックするのではなく、IUnknown::QueryInterface からの戻り値をチェックします。

null をチェックしてもおそらく害はありませんが、インターフェースの保証を考えると、冗長なチェックのように思えます。

于 2009-09-15T10:48:16.057 に答える
0

QIを実行しているCOMオブジェクトの種類(またはホストしているアプリ)によって異なります。ほとんどの場合、HRESULTをチェックするだけで十分です。サードパーティのオブジェクト(エクスプローラーの置き換えなど)を扱っている場合は、おそらくNULLもチェックする必要があります。Explorerはこれを行うため、バグのある拡張機能でのクラッシュを回避したい場合も、次のことを行う必要があります。

于 2009-09-15T23:41:16.113 に答える