2014-05-05 37 views
0

我們與COM連接點的回調接口升級COM回調接口

在我們Sample.idl一個問題,我們有一些回調接口ISomeEvents

interface ISomeEvents : IUnknown 
{ 
     HRESULT Event1([in]int nData); 
     HRESULT Event2([in]int nData); 
     HRESULT Event3([in]int nData); 
} 

And in the CoClass we have the following statement 
coclass MyComp 
{ 
    [default] interface IMyInterface; 
    interface IMyInterFace2; 
    [default, source] interface ISomeEvents; 
}; 

現在,每當我們增加新的接口,增強的一部分,這不會打破現有的客戶端,但如果增強有 回調的任何修改,然後我們最終更新接口ISomeEvents,這是打破現有的客戶端,我們不得不這樣做,因爲我認爲我們可以 只有一個[defaut,source]接口。

誰能告訴我這是什麼解決方法?

問候 湯姆

回答

1

如果你正在開發一個COM對象,其中客戶端(S)是活/生產,你真的不應該更改現有的接口,任何接口。這一直是COM開發的基本規則:「接口是不可變的」;當然,在早期開發過程中會有例外。

(例如:「COM接口是不可變的,你不能定義一箇舊接口的新版本,並給它一個相同的標識符。」(http://msdn.microsoft.com/en-us/library/windows/desktop/ms688484(v=vs.85).aspx)在Web上查找「接口是不可變的」很多更多)

在這種情況下,您應該創建新接口ISomeEvents2ISomeEvents3,如有需要,以及使這些接口繼承以前的版本。將新界面設置爲新的默認源。

interface ISomeEvents1 : ISomeEvents 
{ 
    /* new enhanced events here, for use by newly compiled clients */ 
} 

最後,如果你需要更多的變化:

interface ISomeEvents2 : ISomeEvents1 
{ 
    /* Even newer enhanced events here, for even newer clients */ 
} 

等。

+0

我們有一個COM Interop層和COM組件,我們有一個要求,即COM DLL應該向後兼容,現在如果默認的源接口被更改,你能告訴我這將如何向後兼容,因爲舊的互操作層將不知道ISomeEvents2 – user2101801

+0

我認爲這應該沒問題。無論您做什麼,使用舊互操作的舊客戶都無法使用新功能。舊的互操作實際上應該能夠繼續實施和使用'ISomeEvents'就好了。只有更新的客戶端實現'ISomeEvents2'會使用額外的成員。 (但是我沒有在十年內完成COM事件;如果您認爲這是錯誤的,請告訴我。) –

+0

通過將默認源接口設置爲ISomeEvents2,您打破了舊客戶端,COM應該是版本兼容的。如果你有一個接口說IMyInterface和後來你添加一個新的接口IMyInterface2,舊的客戶端應用程序可以繼續使用新的DLL並使用IMyInterface2,這不會打破客戶端,但對於源接口,我認爲這是一個問題,什麼是這個解決方案 – user2101801