1

完全なリストではありませんが、次の方法を使用して C++ プログラムで .NET ライブラリをホストしています。

CorBindToRuntimeEx()
GetDefaultDomain()
CreateInstance()
Invoke()

.NET クラスに対応する C++ クラスがあります。各クラス インスタンスには が含まれておりCComPtr<IDispatch>、これを使用して関数を呼び出し、メンバー変数を取得/設定します。

これは正常に機能していますが、C++ クラスをコピーすると、最終的に 2 つの C++ クラス インスタンスが同じ .NET インスタンスを指すことになります。あるインスタンスで変数値を変更すると、別のインスタンスに反映されます。

したがって、各 C++ クラス インスタンスが 1 つの一意の .NET クラス インスタンスを持つように、IDispatch ポインターを複製したいと考えています。を呼び出すことはできますCreateInstance()が、さまざまな理由から、ライブラリとクラスの名前を把握するのは不便です。

tl;dr
クラス/ライブラリ名を検索せずに、.NET でサポートされている IDispatch ポインターを複製するにはどうすればよいですか?

ありがとう!

4

1 に答える 1

3

これは予想される動作です。CComPtrコピーコンストラクターは、インターフェイスポインターをコピーし、AddRef()を使用して参照を追加するだけです。COMでも.NETでも、ディープコピーを自動的に作成するメカニズムはありません。これはC++と基本的に違いはありません。.NET、ICloneableで定義されたよく知られたインターフェースがあります。非推奨になることをかろうじて回避しました。インターフェイスには、浅いコピーではなく深いコピーが必要であることを呼び出し元に指定させる方法がありません。それを役に立たなくし、実装されることはめったにありません。とにかくここでは役に立ちません。COMには同様のものはありません。

いいえ、十分な状態を維持し、新しいオブジェクトを作成するためのコードを作成する必要があります。これに対するあなたの必要性を見直してください。COMオブジェクト(およびその基になる.NETオブジェクト)のコピーを作成することのみを目的としてC ++オブジェクトのコピーを作成する場合は、おそらくそのコピーを作成するべきではありません。

于 2011-03-12T03:46:38.340 に答える