6

Windows ImagingComponentライブラリを処理するいくつかのレガシーC++コードを調べていますが、これを観察しました。

void setProperties(IPropertyBag2* const pBag)
{  
   pBag->Write(...);
}

void other_function()
{
   CComPtr<IPropertyBag2> pBag;
   //Code to initialize pBag
   setProperties(pBag);
}

このsetPropertiesメソッドは、一連のプロパティをプロパティバッグに書き込むだけです。適切な型キャスト演算子を呼び出すと思うので、コードはコンパイルされて正常に実行されます。

私の質問は、そのようなインターフェースが推奨されているのか、それともポインターを渡すためのより良い方法があるのか​​ということです。たとえば、署名が次のように変更された場合、(安全性/パフォーマンスの点で)違いはありますか?

void setProperties(const CComPtr<IPropertyBag2>& pBag)
4

2 に答える 2

2

生のインターフェイスポインタは、COMオブジェクトを操作するための標準的な方法です。それらはまた最も柔軟です。CComPtrへの参照を使用すると、常にCComPtrを使用することになります。

AddRefオブジェクト自体がandを実装しているため、COMポインターは、ダムポインターであっても、自動的にスマートポインターになりReleaseます。関数がポインターのコピーを保持していない場合は、それについて心配する必要はありません。

CComPtrタイプは、便宜上、自動的に生のポインターにキャストされます。

于 2012-09-21T02:30:03.770 に答える
1

CComPtr パラメーターを使用する利点はあまりありません (非 const であり、変更する場合を除きます)。CComPtr は、ローカル変数とインスタンス変数に対してより便利です。

ただし、スタイル/一貫性の問題としてのみであれば、それを行うことは問題ありません。

于 2012-09-21T02:16:44.097 に答える