11

これはおそらく初心者のCOMの質問ですが、これをグーグルで検索すると、回答を提供するよりも多くの質問が発生します。

ローカルCOMインスタンスにCoCreateInstanceの代わりに「operatornew」を使用しても安全ですか?

私がしたこと:

  1. パブリック継承を使用してIOperationsProgressDialogインターフェイス http://msdn.microsoft.com/en-us/library/windows/desktop/bb775368(v=vs.85).aspxを実装し、それによってIUnknownインターフェイスも実装しました。

  2. 「newRecyclerProgressCallback」を介してインスタンスを作成し、それを生涯管理のためにCOM-Ptrに配置しました。「RecyclerProgressCallback」は私の派生クラスの名前です。

  3. IFileOperation ::SetProgressDialoghttp://msdn.microsoft.com/en-us/library/windows/desktop/bb775803(v=vs.85).aspxでこのインスタンスを使用してい ます

要約:私のアプローチは機能しているように見えますが、私はそれを信頼していません。COMオブジェクトの作成に関する情報が多すぎて、観察可能な動作のみに依存することはできません。

微妙なリスク、誤謬、その他の問題はありますか?ありがとう!

4

5 に答える 5

5

私もそれらをスタックに入れました。アンドレイの回答 (現在は削除されています) は、COM 参照カウントをバイパスするため、安全ではないことを誤って示唆しています。これは誤った推論です。COM は参照をカウントしません。それはあなたに責任を委任します。COM が最後のインターフェイスでメソッドを呼び出した後delete、 、 またはfree()、または言語が使用するものは何でも呼び出す必要があります。Release重要な単語はafterです。すぐにそうする義務はないので、いつではありません。

同様に、CoCreateInstanceCOM は言語に依存せず、 オブジェクトをmallocまたはで作成する必要があるかどうかがわからないため、 は長い回り道になりますnew。そうするので、COM ロジック全体をバイパスするだけです。

于 2012-10-24T16:03:36.923 に答える
1

それは、具体的に何をインスタンス化するかによって異なります。COM ポインターを提供することになっている場合、それが COM API でインスタンス化されているかどうかを尋ねる人は誰newもいません。 .

したがって、答えは「はい」です。使用できますnewし、問題ありません。ただし、とにかく有効な COM インターフェイスである必要があり、参照カウントとQueryInterfaceCOM オブジェクトの方法を実装する必要があります。

于 2012-10-24T16:02:29.103 に答える
1

CoCreateInstanceAPIは、registry指定されたモジュールに一致するモジュールを見つけてロードし、メカニズムを介して(コードがまたはであるかCLSIDによって異なります)、いくつかの関数を呼び出してオブジェクトを作成します。したがって、コードを機能させるには、インターフェースを実装するクラスを作成してレジストリに登録し、それを呼び出してコードでいくつかの追加作業を行い、少なくとも素敵な作業を行う必要があります。もちろん、はい安全。一般に、コードでインターフェイス (コールバック用にのみ宣言されたインターフェイス)の実装を呼び出すことは常に安全であり、これも推奨される方法です。DLLEXECoCreateInstanceIClassFactoryCOMCoCreateInstanceoperator newoperator newsource

于 2012-10-24T16:04:56.940 に答える
0

これはうまくいきます。これは、通常、COM サーバーがそのオブジェクトを内部で作成する方法です (少なくとも 1 つは C++ で記述されています)。あなたの観点からは、 RecyclerProgressCallback クラスは単なる C++ コードです。プログラム内の他のクラスと同様に扱うことができます。

そうは言っても、COM は微妙な落とし穴の地雷原です。クラスで問題が発生しないとは約束できませんが、これらの問題が new 演算子の使用とは無関係であることは保証できます。

于 2012-10-24T16:04:11.973 に答える
-1

参照カウントのためだけでなく、マーシャリングのためにも、一般的に安全ではありません。クラスには、マーシャリングを必要とするスレッド モデルがある場合があります。その場合、CoCreateInstance はプロキシとスタブを作成しますが、作成しnewません。

于 2012-10-24T17:48:55.720 に答える