IDispatch es la interfaz que expone el protocolo de automatización OLE . [1] Ampliando IUnknown , es una de las interfaces estándar que pueden exponer los objetos COM . COM distingue entre tres tipos de interfaz: personalizadas que son interfaces IUnknown basadas en VTABLE, despacho que son interfaces IDispatch que admiten la introspección e interfaces duales que admiten ambos tipos.
La interfaz de Automatización (IDispatch) permite que una aplicación cliente averigüe qué propiedades y métodos son compatibles con 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 cuando se compilan. Esto permite que los objetos COM y ActiveX sean llamados por plataformas de programas de secuencias de comandos como el servidor ASP y JavaScript en Internet Explorer , donde las convenciones de llamada no se conocían en el momento en que se construyeron IIS o IE. Por el contrario, una biblioteca de objetos simple se compila y se vincula a un programa, por ejemplo, una llamada DLL necesita conocer un nombre de función y parámetros en el momento de la compilación.
Un guionista puede pedirle al objeto COM un método o propiedad que ya conozca de la documentación. Luego, el cliente puede ejecutar la función con Invoke proporcionada por la interfaz IDispatch, una forma de enlace tardío . Este tipo de capacidad también fue compatible con Dynamic Data Exchange (DDE), que nunca se hizo popular debido a su nivel demasiado bajo.
Las interfaces de despacho son flexibles, pero sufren una introspección adicional y una sobrecarga de invocación en comparación con las interfaces personalizadas . [2] Por lo tanto, a menudo es una buena idea admitir ambos tipos de interfaz con interfaces duales . De esa manera, los clientes que admiten la invocación basada en VTABLE pueden usar la interfaz personalizada en lugar de la contraparte de envío .
Métodos
Cada propiedad y método implementado por un objeto que admite la interfaz IDispatch tiene lo que se llama un ID de envío, que a menudo se abrevia DISPID. El DISPID es el medio principal para identificar una propiedad o método y debe proporcionarse a la función Invoke para que se invoque una propiedad o método, junto con una matriz de variantes que contienen los parámetros. La función GetIDsOfNames se puede utilizar para obtener el DISPID apropiado de un nombre de método o propiedad que esté en formato de cadena .
IDispatch se deriva de IUnknown y lo amplía con cuatro métodos adicionales:
interfaz IDispatch : public IUnknown { virtual HRESULT GetTypeInfoCount ( unsigned int * pctinfo ) = 0 ; virtual HRESULT GetTypeInfo ( unsigned int iTInfo , LCID lcid , ITypeInfo ** ppTInfo ) = 0 ; virtuales HRESULT GetIDsOfNames ( REFIID riid , OLECHAR ** rgszNames , unsigned int CNAME , 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
- ^ Microsoft MSDN: interfaz IDispatch
- ^ Microsoft MSDN: ActiveX / COM Q&A diciembre de 1995
enlaces externos
- DispHelper , una biblioteca de código abierto para ayudar a usar un IDispatch desde C o C ++.
- IDispatchCodeGenerator , generador de código. Característica que agrega IDispatch a un objeto. El lenguaje es C ++.