2009-10-25 13 views
8

COM es conocido por hacer posible la compatibilidad con versiones anteriores cuando se lanzan nuevos componentes o aplicaciones. Esto es posible porque las interfaces en COM son estables, es decir, no cambian.¿Cómo evolucionar una interfaz COM?

Intenté encontrar una referencia o un libro que trate una descripción sobre cómo evocar una interfaz COM de una versión a otra.

Los siguientes son mis requisitos:

Tenemos una aplicación que puede ser accionado por la automatización OLE. Se pueden instalar nuevas versiones de esta aplicación en paralelo a versiones anteriores.

Los clientes COM de estas aplicaciones pueden usar la versión PROGID independiente en cuyo caso trabajan con la última versión de la aplicación o una versión dependiente de PROGID en cuyo caso trabajan con la versión específica de la aplicación.

Los cambios en la automatización COM no deben interrumpir ninguno de los clientes.

vamos a ver un ejemplo:

#include <olectl.h> 
#include <fxbase\autoif.h> 

[ 
    uuid(A1B3A66F-806F-46a2-82D9-9C278F415148), 
    lcid(-1), 
    version(1.0) 
] 

library LIB 
{ 
     importlib("stdole2.tlb"); 

     [ 
      uuid(82CDE055-790A-4505-BF3E-3282170C8FC6), 
      helpstring("Document"), 
      oleautomation, 
      dual, 
      nonextensible 
     ] 
     interface IDocument : IDispatch 
     { 
       [id(0x00000001), propget, helpcontext(0x0012c94a)] 
       HRESULT Name([out, retval] BSTR* psName); 

       [id(0x00000001), propput, helpcontext(0x0012c94a)] 
       HRESULT Name([in] BSTR psName); 
     } 

     [ 
      uuid(919B9E6E-76C0-4c23-A188-5840E5900997), 
      helpstring("Application object."), 
      oleautomation, 
      dual, 
      nonextensible 
     ] 
     interface IApplication : IDispatch 
     { 
      [id(0x00000001), propget, helpstring("Returns the active document of the application.")] 
      HRESULT ActiveDocument([out, retval] IDocument** retval); 
     } 

     [ 
      uuid(E0AA6FCA-AEF1-460b-A1F9-26250C28594B), 
      helpstring("Application 1.0 Class"), 
      appobject 
     ] 
     coclass Application 
     { 
      [default] interface IApplication; 
           interface IDispatch; 
     } 
} 

Digamos que quiero publicar la versión 2.0 de esta aplicación que se extiende algunas interfaces. Aquí está mi enfoque ingenuo a la versión 2.0:

#include <olectl.h> 
#include <fxbase\autoif.h> 

[ 
    uuid(3D4688A2-91F8-4cd8-989A-845810A05557), 
    lcid(-1), 
    version(2.0) 
] 

library LIB 
{ 
     importlib("stdole2.tlb"); 

     [ 
      uuid(82CDE055-790A-4505-BF3E-3282170C8FC6), 
      helpstring("Document"), 
      oleautomation, 
      dual 
     ] 
     interface IDocument10 : IDispatch 
     { 
       [id(0x00000001), propget, helpcontext(0x0012c94a)] 
       HRESULT Name([out, retval] BSTR* psName); 

       [id(0x00000001), propput, helpcontext(0x0012c94a)] 
       HRESULT Name([in] BSTR psName); 
     } 

     [ 
      uuid(AF404510-216A-407e-99F4-0636AF071B68), 
      helpstring("Document"), 
      oleautomation, 
      dual, 
      nonextensible 
     ] 
     interface IDocument : IDocument10 
     { 
       [id(0x00000001), propget, helpcontext(0x0012c94a)] 
       HRESULT Type([out, retval] BSTR* psType); 

       [id(0x00000001), propput, helpcontext(0x0012c94a)] 
       HRESULT Type([in] BSTR psType); 
     } 

     [ 
      uuid(919B9E6E-76C0-4c23-A188-5840E5900997), 
      helpstring("Application object."), 
      oleautomation, 
      dual 
     ] 
     interface IApplication10 : IDispatch 
     { 
      [id(0x00000001), propget, helpstring("Returns the active document of the application.")] 
      HRESULT ActiveDocument([out, retval] IDocument** retval); 
     } 

     [ 
      uuid(6A851C3F-21DF-4f5e-A4D6-2EF5A9D234C6), 
      helpstring("Application object."), 
      oleautomation, 
      dual, 
      nonextensible 
     ] 
     interface IApplication : IApplication10 
     { 
      [id(0x00000002), propget, helpstring("Is the application visible.")] 
      HRESULT Visible([out, retval] BOOL* retval); 
     } 

     [ 
      uuid(AA760349-1682-4ab6-BF0C-C02E620715CF), 
      helpstring("Application 2.0 Class"), 
      appobject 
     ] 
     coclass Application 
     { 
      [default] interface IApplication; 
           interface IDispatch; 
     } 
} 

¿Es esta la forma correcta de hacerlo?

¿Debo agregar una clase Application10 y Application20 al Registro para agregar una posibilidad de crear instancias de las diferentes versiones de la aplicación para clientes de scripts?

¿Es correcto cambiar la versión y el GUID de la biblioteca de tipos?

IDocument en la versión 2.0 tiene un nuevo IID. ¿Puedo seguir usando IDocument en IApplication.ActiveDocument?

¿Cómo debo registrar el coclass o la interfaz en el Registro de Windows en las diferentes versiones?

Tenga en cuenta que no utilizo ATL u otras bibliotecas además de WIN32-API.

Si sabe dónde puedo encontrar información sobre esto (libros, referencias, etc.) sugiérelo.

Realmente agradecería su ayuda.

Respuesta

10

Sí, debe cambiar el class id de su objeto si quiere que coexistan varias versiones. Sin embargo, puede mantener un program id independiente de la versión como "Word.Application" o "InternetExplorer.Application" que redirects to the class id of the current version. La compatibilidad con versiones anteriores es muy difícil de mantener. MSXML aparentemente abandonó la práctica de progID independiente de la versión.

Si decide mantener las interfaces antiguas (recomendado), debe implementar interfaces nuevas y antiguas en su nuevo objeto.

Es posible que desee comprobar el registro de Microsoft Office. Mantiene la compatibilidad con versiones anteriores bastante bien.

El nombre sugerido para las nuevas interfaces sería el nombre de la interfaz más el número de versión, como IHtmlDocument6.

+0

Realmente me gustaría aprender de las entradas de registro de Microsoft Office, pero no tengo una versión anterior. ¿Conoces programas gratuitos para aprender? – frast

+0

¿Por qué es necesario cambiar el CLSID? La implementación aún implementará todas las interfaces que hizo, ¿verdad? –

+0

@frast o consultar IE's. –

Cuestiones relacionadas