2015-02-12 53 views
1


我有一個項目,它在列表中引用了少數com對象(對於每個項目)。我需要在循環中複製一個對象,並在迭代中將其與第二個對象進行比較。
我不知道如何通過值複製COM對象。請幫忙。
謝謝。通過.NET中的值複製COM對象

回答

2

您看不到COM對象的內部狀態,因爲您只有一個接口。

您僅限於COM接口可能暴露的任何屬性獲取器和推杆。

對於某些對象,獲取每個屬性,並調用匹配的put_函數可能就足夠了。在某些情況下,它可能不是。

存在一些用於序列化或持久化的接口,您可以使用它們來存儲對象,然後重新生成一個對象的副本。

某些COM接口可能會暴露->Clone()方法。但這很少見。

簡而言之,沒有可靠的方法來克隆任何通用的COM對象。 COM對象必須以某種方式支持複製

+0

實際上,如果COM對象支持[COM持久性](http://stackoverflow.com/a/28470998/1768303),則可能有可靠的方法。 – Noseratio 2015-02-12 06:45:21

2

檢查您的COM對象是否支持IPersistStream或理想情況下IPersistStreamInit。這將允許您將COM對象狀態保存到COM流(System.Runtime.InteropServices.ComTypes.IStream)。

您可以使用CreateStreamOnHGlobal API創建內存中的COM流,然後創建一個新的COM對象並從流中恢復其狀態。基本上,你會有一個克隆的對象。

還有其他COM持久性接口(IPersistFile,IPersistMoniker),但它們會更難使用。