在 .NET 中按值复制 COM 对象
Copy COM object by Value in .NET
我有一个项目引用列表中的几个 com 对象(每个)。我需要在循环中复制一个对象并将其与迭代中的第二个对象进行比较。
我不确定如何按值复制 com 对象。请帮忙
谢谢。
您无法看到 COM 对象的内部状态,因为您只有它的接口。
您只能使用 COM 接口可能公开的任何 属性 个 getter 和 putter。
对于某些对象,尽可能获取每个 属性,然后调用匹配的 put_
函数可能就足够了。在某些情况下,它可能不是。
存在一些用于序列化或持久化的接口,您可以使用它们来存储对象,然后恢复它的副本。
某些 COM 接口可能公开 ->Clone()
方法。但那是很少见的。
简而言之,没有可靠的方法来克隆任何通用 COM 对象。 COM 对象必须以某种方式支持复制
检查您的 COM 对象是否支持 IPersistStream
或理想情况下支持 IPersistStreamInit
。这将允许您将 COM 对象状态保存到 COM 流中 (System.Runtime.InteropServices.ComTypes.IStream
)。
您可以使用 CreateStreamOnHGlobal
API 创建一个内存中的 COM 流,然后创建一个新的 COM 对象并从该流中恢复其状态。本质上,您将拥有一个克隆对象。
还有其他 COM 持久性接口(IPersistFile
、IPersistMoniker
),但使用起来会有点困难。
我有一个项目引用列表中的几个 com 对象(每个)。我需要在循环中复制一个对象并将其与迭代中的第二个对象进行比较。
我不确定如何按值复制 com 对象。请帮忙
谢谢。
您无法看到 COM 对象的内部状态,因为您只有它的接口。
您只能使用 COM 接口可能公开的任何 属性 个 getter 和 putter。
对于某些对象,尽可能获取每个 属性,然后调用匹配的 put_
函数可能就足够了。在某些情况下,它可能不是。
存在一些用于序列化或持久化的接口,您可以使用它们来存储对象,然后恢复它的副本。
某些 COM 接口可能公开 ->Clone()
方法。但那是很少见的。
简而言之,没有可靠的方法来克隆任何通用 COM 对象。 COM 对象必须以某种方式支持复制
检查您的 COM 对象是否支持 IPersistStream
或理想情况下支持 IPersistStreamInit
。这将允许您将 COM 对象状态保存到 COM 流中 (System.Runtime.InteropServices.ComTypes.IStream
)。
您可以使用 CreateStreamOnHGlobal
API 创建一个内存中的 COM 流,然后创建一个新的 COM 对象并从该流中恢复其状态。本质上,您将拥有一个克隆对象。
还有其他 COM 持久性接口(IPersistFile
、IPersistMoniker
),但使用起来会有点困难。