2013-10-24 184 views
0

是否可以將接口指針分配給另一個接口指針,其中兩個接口指針都指向同一個類。下面 是我的Test.h和Test.cpp的將一個接口指針分配給C++中的另一個接口指針

class Test 
    { 
     ITestPtr testPtr; 
     ITestSecondPtr secondPtr; 
    }; 

Test:: Test() 
    { 
    testPtr.CreateInstance(__uuidof(MyNamespace::MyClass)); 
    secondPtr=testPtr; 
    } 

這裏我ITestPtr和ITestSecondPtr指向同一個C#類MyClass的代碼。因此爲了避免C#類的雙重初始化,我將testPtr分配給了secondPtr。 它建立成功。但運行時會引發訪問衝突緊張。請讓我知道,如果有任何解決方案。

+3

'testPtr.QueryInterface(&secondPtr);',至少是這樣,你可以在C++中使用MS的'comdef'智能接口包裝庫來做到這一點。你在做什麼語言,我不知道,因爲你把它標記爲C++,但在你的問題中只提到了C#。 – WhozCraig

+0

+1給WhozCraig,就是這樣做。 –

+0

@WhozCraig看起來他使用C++/CLI,而他提到的C#類來自DLL或其他東西。 –

回答

1

不可以將指向一個COM接口的指針指定給另一個COM接口。當您爲IUnknown使用QueryInterface時,您將始終獲得與實現對象相同的指針。但是當你查詢一個特定的接口時,你會得到不同的指針。

原因是指針指向VMT指針。當你有不同的IUnknown inherances時,你需要不同的VMT。這就是爲什麼QueryInterface必須在不同的地址選擇正確的VMT。

召回總是返回相同的IUnkown指針的原因是,這允許檢查對象的身份,儘管你爲不同的接口獲得不同的指針。

所以你的請求的解決方案:不要(隱式)投射COM接口指針。使用QueryInterface()來獲得正確的指針。

更多詳細信息是here

+0

@haper:Thanx for Reply。 QueryInterface()給了我正確的答案。 – SkoolBoyAtWork

相關問題