需要复制带有.NET支持的IDispatch *;不懂课名

时间:2011-03-12 01:51:29

标签: .net c++ com com-interop idispatch

我使用以下方法在我的C ++程序中托管.NET库,但不是详尽的列表:

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

我有与.NET类相对应的C ++类。每个类实例都包含一个CComPtr<IDispatch>,我用它来调用函数和获取/设置成员变量。

这工作正常,除非我复制我的C ++类,我最终得到两个指向同一个.NET实例的C ++类实例。当我在一个实例中更改变量值时,它会反映在另一个实例中。

所以,我真的想复制我的IDispatch指针,这样每个C ++类实例都有一个唯一的.NET类实例。我可以打电话给CreateInstance(),但由于种种原因,弄清楚图书馆和班级名称是不方便的。

TL;博士
如何在不查找类/库名称的情况下复制.NET支持的IDispatch指针?

谢谢!

1 个答案:

答案 0 :(得分:3)

这是预期的行为,CComPtr复制构造函数将简单地复制接口指针并使用AddRef()添加引用。在COM和.NET中都没有自动创建深层副本的机制。这与C ++没有根本的区别。 .NET,ICloneable中定义了一个众所周知的接口。它几乎没有被弃用,接口没有办法让调用者指定需要深拷贝而不是浅拷贝。使它旁边没用,很少实现。 COM无论如何都没有帮助,COM没有类似的东西。

不,你必须保持足够的状态并编写代码来创建一个新对象。请仔细检查您的需求。如果您只是为了创建COM对象(及其底层.NET对象)的副本来制作C ++对象副本,那么您可能不应该制作该副本。