升级COM回调接口

时间:2014-05-05 12:47:30

标签: c++ visual-c++ com atl dcom

我们遇到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 个答案:

答案 0 :(得分:1)

如果您正在开发客户端处于生产/生产状态的COM对象,那么您实际上不应该更改现有接口,任何接口。这一直是COM开发的基本规则:“接口是不可变的”;当然,在早期开发过程中会例外。

(这是一个引用例如:“COM接口是不可变的。你不能定义一个新版本的旧接口并给它相同的标识符。”(http://msdn.microsoft.com/en-us/library/windows/desktop/ms688484(v=vs.85).aspx)。查找“接口是不可变的”网络更多)

在这种情况下,您应该根据需要创建新接口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 */
}

等等。