2011-03-12 43 views
1

我用下面的方法託管.NET庫在我的C++程序,雖然不是一個詳盡的列表:需要使用.NET支持複製IDispatch *;不知道類名

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

我必須對應於.NET類C++類。每個類實例都包含一個CComPtr<IDispatch>,我用它來調用函數和獲取/設置成員變量。

這工作正常,除了我拷貝我的C++類時,我最終得到了兩個指向同一個.NET實例的C++類實例。當我在一個實例中更改變量值時,它會反映在另一個實例中。

所以,我真的很想複製我的IDispatch指針,以便每個C++類實例都有一個唯一的.NET類實例。我可以撥打CreateInstance(),但由於各種原因,找出圖書館和班級名稱很不方便。

TL;博士
我如何可以複製我的.NET支持的IDispatch指針頭也不擡類/庫的名稱?

謝謝!

+0

一般來說,這是一個壞主意(TM)從非託管代碼使用.NET;另一種方式很好。但是,您可以檢查.NET對象是否支持ICloneable,如果是,則使用它來克隆它。更好的是,如果您絕對必須這樣做,那麼通過聲明私有或受保護的副本構造函數和複製賦值運算符,可以使您的C++實例不可複製。 – 2011-03-12 03:21:36

+0

嗯,我已經做到了。除了複雜性和低效率之外,爲什麼它不是一個好主意?我顯然不是從本地代碼中使用.NET來獲得樂趣。 – David 2011-03-17 00:44:19

+0

除了複雜性和低效率以外,還可以。它就像從5公里自由降落到地球一樣,除了最終的影響外,還可以。 :-) – 2011-03-17 00:54:43

回答

3

這是預期的行爲,CComPtr拷貝構造函數將簡單地複製接口指針並添加一個帶有AddRef()的引用。在COM和.NET中都沒有自動創建深層副本的機制。這與C++沒有根本的區別。在.NET中定義了一個衆所周知的接口ICloneable。它幾乎不會被棄用,界面沒有辦法讓調用者指定需要深拷貝而不是淺拷貝。讓它旁邊無用,很少實施。無論如何,這裏沒有任何幫助,COM沒有類似的東西。

不,你必須保持足夠的狀態並編寫代碼來創建一個新的對象。請檢查您對此的需求。如果您只是爲了創建COM對象(及其底層.NET對象)的副本而將C++對象複製,那麼您可能不應該創建該副本。

+0

謝謝你的詳細解答。 – David 2011-03-14 17:10:47