用VC6开发ATL COM组件,
如何使接口改动后,原有的应用不用重新编译。注册表中好像有版本管理的机制,不知如何在代码中控制。

解决方案 »

  1.   

    重新编译不要改clsid号码即可,另外对外接口要完全保留老的接口
      

  2.   

    clsid肯定是不变的,接口增加方法或属性后,
    有些应用比如Dephi还是要重新引用、重新编译才能正常使用组件。
      

  3.   

    我不太清楚delphi中使用组件的方法,但是,com组件只要二进制兼容,应该是不用编译就可直接使用的.
      

  4.   

    定义一个新的接口(通常是在老接口名的后面加个2随便看习惯),接口中要包含老接口的所有接口函数,当然在实现端就用老接口的一份实现.在新接口中加入你要升级的新的接口函数,或者是对老接口的函数的生机版(通常是在老接口函数名的后面也加个2,随便看习惯).老接口:
    interface ISample : IUnknown
    {
      HRESULT DoSomething();
      HRESULT Func();
    };新接口:
    interface ISample2 : IUnknown
    {
      HRESULT DoSomething();     // 不改变这个函数还是使用老的实现.
      HRESULT Func();            // 不改变这个函数还是使用老的实现.
      HRESULT Func2();           // 新的函数对Func()的升级版本.
      HRESULT NewFun();          // 一个新的函数.
    }
      

  5.   

    老接口:
    interface ISample : IUnknown
    {
      HRESULT DoSomething();
      HRESULT Func();
    };新接口:
    interface ISample2 : IUnknown
    {
     // HRESULT DoSomething();     不需要
     // HRESULT Func();            不需要
        HRESULT Func2();           // 新的函数对Func()的升级版本.
      HRESULT NewFun();          // 一个新的函数.
    }派生类时要同时派生自这两个接口使用组件时可以通过查询接口查到两个接口。
      

  6.   

    楼上的你把
     // HRESULT DoSomething();     不需要
     // HRESULT Func();            不需要这两个函数干掉, 还怎么通过, 升级的新接口去调用,DoSomething, Func两个函数?????
    这个两个函数还是要在接口中声明的, 只是利用老的实现就可以了
      

  7.   

    楼上的你把
     // HRESULT DoSomething();     不需要
     // HRESULT Func();            不需要这两个函数干掉, 还怎么通过升级的新接口(ISample2)去调用,DoSomething, Func两个函数?????
    这个两个函数还是要在接口中声明的, 只是利用老的实现就可以了
      

  8.   

    coclass的CLSID要不要改呢?
    library的GUID要不要改呢?