2014-05-05 62 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