代码之家  ›  专栏  ›  技术社区  ›  LeopardSkinPillBoxHat

为什么需要在IDL接口的*end*添加新事件?

  •  2
  • LeopardSkinPillBoxHat  · 技术社区  · 16 年前

    我发现,当我向现有的COM/IDL接口添加新事件时,除非将它们添加到接口末尾,否则有时会遇到奇怪的问题。

    interface IMyEvents
    {
        HRESULT FooCallback(
            [in] long MyParam1,
            [in] long MyParam2,
            [in] long MyParam3);
    
        HRESULT BarCallback(
            [in] long MyParam1,
            [in] BSTR MyParam2,
            [in] BSTR MyParam3);
    };
    

    NewCallback

    interface IMyEvents
    {
        HRESULT FooCallback(
            [in] long MyParam1,
            [in] long MyParam2,
            [in] long MyParam3);
    
        HRESULT BarCallback(
            [in] long MyParam1,
            [in] BSTR MyParam2,
            [in] BSTR MyParam3);
    
        /* New event added to the end */
        HRESULT NewCallback(
            [in] BSTR MyParam1,
            [in] BSTR MyParam2,
            [in] BSTR MyParam3);
    };
    

    interface IMyEvents
    {
        HRESULT FooCallback(
            [in] long MyParam1,
            [in] long MyParam2,
            [in] long MyParam3);
    
        /* New event added to the middle */
        HRESULT NewCallback(
            [in] BSTR MyParam1,
            [in] BSTR MyParam2,
            [in] BSTR MyParam3);
    
        HRESULT BarCallback(
            [in] long MyParam1,
            [in] BSTR MyParam2,
            [in] BSTR MyParam3);
    };
    

    有人能解释这种行为吗?

    2 回复  |  直到 16 年前
        1
  •  4
  •   sterin    16 年前

    您不应该修改现有的COM接口。未与更改一起编译的客户端不会意识到这一点,并将继续像更改前那样进行调用。

    结果是,现有客户端使用一个长整数调用BarCallback,但得到的NewCallback认为这个长整数是一个BSTR。结果往往令人不快。

    在最后添加新函数时,您也会遇到类似的问题。旧的COM对象没有实现新函数,当您尝试调用它时,它可能会崩溃。

        2
  •  0
  •   lava    16 年前

    推荐文章