Articulo de referencia

IDispatch

IDispatch es la interfaz que expone el protocolo de automatización OLE . [ 1 ] Al extender IUnknown , es una de las interfaces estándar que pueden exponer los objetos COM . COM ...

IDispatch es la interfaz que expone el protocolo de automatización OLE . [ 1 ] Al extender IUnknown , es una de las interfaces estándar que pueden exponer los objetos COM . COM distingue entre tres tipos de interfaz: personalizada , que son interfaces IUnknown basadas en VTABLE; de despacho , que son interfaces IDispatch que admiten introspección; e interfaces duales , que admiten ambos tipos.

La interfaz de automatización (IDispatch) permite que una aplicación cliente descubra qué propiedades y métodos admite un objeto en tiempo de ejecución, es decir, implementa el concepto de RTTI . También proporciona la información necesaria para invocar estas propiedades y métodos. Las aplicaciones cliente no necesitan conocer los miembros del objeto al compilarse. Esto permite que los objetos COM y ActiveX sean llamados por plataformas de programas de scripting como el servidor ASP y JavaScript en Internet Explorer , donde las convenciones de llamada eran desconocidas cuando se crearon IIS o IE. Por el contrario, una biblioteca de objetos simple se compila y enlaza en un programa; por ejemplo, una llamada a una DLL necesita conocer el nombre de una función y sus parámetros en tiempo de compilación.

Un programador puede solicitar al objeto COM un método o propiedad que ya conoce gracias a la documentación. A continuación, el cliente puede ejecutar la función con Invoke, proporcionado por la interfaz IDispatch, una forma de enlace tardío . Este tipo de funcionalidad también era compatible con Dynamic Data Exchange (DDE), que nunca se popularizó por ser de bajo nivel.

Las interfaces de despacho son flexibles, pero conllevan una sobrecarga adicional de introspección e invocación en comparación con las interfaces personalizadas . [ 2 ] Por lo tanto, suele ser recomendable admitir ambos tipos de interfaz con interfaces duales . De esta forma, los clientes que admiten la invocación basada en VTABLE pueden usar la interfaz personalizada en lugar de su contraparte de despacho .

Métodos

Cada propiedad y método implementado por un objeto que admite la interfaz IDispatch tiene un identificador de despacho (Dispatch ID), a menudo abreviado como DISPID. El DISPID es el principal medio para identificar una propiedad o método y debe proporcionarse a la función Invoke para que se invoque, junto con una matriz de variantes que contenga los parámetros. La función GetIDsOfNames se puede usar para obtener el DISPID correspondiente a partir del nombre de una propiedad o método en formato de cadena .

IDispatch deriva de IUnknown y lo extiende con cuatro métodos adicionales:

interface IDispatch : public IUnknown { virtual HRESULT GetTypeInfoCount ( unsigned int * pctinfo ) = 0 ; virtual HRESULT GetTypeInfo ( unsigned int iTInfo , LCID lcid , ITypeInfo ** ppTInfo ) = 0 ; virtual HRESULT GetIDsOfNames ( REFIID riid , OLECHAR ** rgszNames , unsigned int cNames , LCID lcid , DISPID * rgDispId ) = 0 ; virtual HRESULT Invoke ( DISPID dispIdMember , REFIID riid , LCID lcid , WORD wFlags , DISPPARAMS * pDispParams , VARIANT * pVarResult , EXCEPINFO * pExcepInfo , unsigned int * puArgErr ) = 0 ; };

El ID de la interfaz IDispatch se define como un GUID con el valor {00020400-0000-0000-C000-000000000046}.

Referencias

  1. Microsoft MSDN: Interfaz IDispatch
  2. Microsoft MSDN: Preguntas y respuestas sobre ActiveX/COM, diciembre de 1995
  • DispHelper , una biblioteca de código abierto para facilitar el uso de IDispatch desde C o C++.