2

COMインターフェイスIYおよびIZを実装するC++クラスXがあり、タイプXのオブジェクトのIYインターフェイスへのポインタyがある場合、次のようにします。

IZ *z = dynamic_cast<IZ *> ( y );

それはオブジェクトの参照カウントを上げませんね?それを説明するためにRelease()を実行する必要はありませんよね?

重要な場合は、ATL/COMを使用しています。

答えは「参照数を増やすことはなく、Release()をする必要もない」と推測していますが、確認したいと思います。

前もって感謝します。

4

3 に答える 3

4

dynamic_cast は、複数の理由で使用してはなりません:

  • 宛先が RTTI をサポートしているかどうかがわからない
  • OLE がプロキシを作成しないかどうかわからない
  • ...

代わりに QueryInterface を使用してください - それはあなたが望むことをします。

上記の質問が確かであっても - キャストはrefcounterを変更しません

于 2009-09-22T15:39:16.360 に答える
3

COMオブジェクトの参照カウントは、誰かがIUnknown :: AddRef()を呼び出すと増加します。QueryInterface()は、新しいインターフェイスポインターを提供するため、COMルールに従って、内部でAddRef()を呼び出します。

投稿されたコードでは、AddRef()を呼び出しておらず、AddRef()を呼び出す可能性のある関数も呼び出していないのに、なぜ参照カウントが増加すると思いますか?

ATL / MFCが自分の脳に何をするかに関わらず、魔法は関係していません。疑わしい場合は、いつでもVSで逆アセンブリを表示してステップスルーし、 AddRef()が呼び出されていないことを確認できます。

編集:そして、私はデューフィーが言ったことを繰り返したいのですが、これをしないでください。QueryInterface()を使用します。またはCComQIPtr<>(本当に必要な場合)。

さらに編集:CComPtr<>とCComQIPtr<>を使用する場合は、Release()を呼び出す必要がなく、適切な参照カウントを把握する負担の多くが軽減されます。あなたは本当にそれらを使うことを考えるべきです。

于 2009-09-22T15:53:25.200 に答える
0

C++Builder ではdynamic_cast、COM インターフェイス上のポインタは実際にはQueryInterface. QI が成功した場合、返されたポインタはAddRef'd になります。

COM オブジェクトを実装するクラスは、より一般的な C++ クラスとは異なる vtable レイアウトを持つため、C++ スタイルdynamic_castは機能しません。これが、C++Builder が QueryInterface を実行するというより賢明なことを行う理由だと思います。

(COM の当初のアイデアは、C++ オブジェクト モデルを一般化して、言語に依存せず、バイナリ標準にすることでした。名前が dynamic_cast から QueryInterface に変更されました)。

dynamic_cast が未定義の動作を引き起こす場合、一番の答えは MSVC を参照していると思います。

于 2014-08-19T10:41:33.390 に答える