2012-04-06 10 views
1

Windows SDKのDirectShowサンプルを調べています。多くのクラスでは、デフォルト以外のコンストラクタが使用されています。それらのコンストラクタはどのように呼び出されますか?誰が議論を出しますか?COMクラスにコンストラクタが必要な理由登録なしでCOMクラスを使用するには?

これらのクラスを登録せずにC++プログラムで使用できますか?もしそうなら、クラスコンストラクターを直接使用することができます。私は次のコードで何が起こるか登録なしCOMクラスを使用する場合は

Foo * foo = new Foo(.....); // note, not using CoCreateInstance 
Bar * bar = foo->QueryInterface(...); 
bar->Release(); 
delete foo; // CRASH? 

ありがとうございました!

+0

'Release'が一般的なケースでどのように実装されているのかわかりません(ノーオペレーションでも、別のメモリアロケータでも可能です)。ここでは、 'これを削除する 'ことが考えられます。あなたは 'CoCreateInstance' +' Release'を使うべきです、これは唯一安全なことです。 –

答えて

2

COMとはまったく関係がありません。フレームワークはこのように構築されており、DirectShow BaseClassesのコンストラクタ引数はクラス、祖先、インスタンス化ファクトリをすべて取得するために必要です。

登録なしでCOMクラスを使用することは可能かもしれないし、そうでないかもしれません。代わりに登録せずにDirectShowフィルターを使用することに興味があると思われます。そのトピックに関する記事はUsing Filters Without Registrationです。

2

として公開されているC++クラス COMコクラスには、一般に引数を取るコンストラクタはありません。 COMクライアントコードが引数をCoCreateInstance()関数に渡すメカニズムはありません。 COMインターフェイスには通常、必要な初期化を行うInitialize()メソッドがあります。 CoCreateInstanceは、クラスファクトリ(IClassFactory)を隠す便利な関数に過ぎません。カスタムCreateInstance()メソッドを持つカスタムクラスファクトリは可能ですが、めったに行われません。

マイクロソフトでは、COMコード以外のコードでも共通するインターフェイスベースのプログラミングモデルを使用しています。 DirectXは良い例です。 Direct3DCreate9Ex()をクラスファクトリと考えてください。

関連する問題