¿Cómo sabe CreateStdDispatch qué método invocar?
me enfrento a implementar unaIDispatch
interfaz. Hay cuatro métodos, y afortunadamente 3 de ellos son fáciles:
function TIEEventsSink.GetTypeInfoCount(...): HResult;
{
Result := E_NOTIMPL;
}
function TIEEventsSink.GetTypeInfo(...): HResult;
{
Result := E_NOTIMPL;
}
function TIEEventsSink.GetIDsOfNames(...): HResult;
{
Result := E_NOTIMPL;
}
Es el último método,Invoke
eso es difícil. Aquí me enfrento a tener que en realidad el caso DispID, y llame a mi método apropiado; desmarcar parámetros de una matriz variante.
function Invoke(
dispIdMember: DISPID;
riid: REFIID;
lcid: LCID;
wFlags: WORD;
var pDispParams: DISPPARAMS;
var pVarResult: VARIANT;
var pExcepInfo: EXCEPINFO;
var puArgErr: DWORD
): HRESULT;
No queriendo tener que escribir todo el tedioso código repetitivo, que estoy seguro de que tendrá errores, busqué en Google, en lugar de hacer ningún trabajo.
i encontré este fragmento enla documentación de MSDN deIDispatch.Invoke
:
En general, no debe implementarInvoca directamente.
¡Excelente! ¡No quería implementarlo de todos modos! Lectura continua:
n su lugar, use la interfaz de despacho para crear funcione CreateStdDispatch y DispInvoke. Para más detalles, consulte CreateStdDispatch, DispInvoke, Creando la interfaz IDispatch yExposición de objetos ActiveX.
LosCreando la interfaz IDispatch link dice:
Puede implementar IDispatch por cualquiera de los siguientes medios:
[recorteCalling the CreateStdDispatch función. Este enfoque es el más simple, pero no proporciona un manejo de errores rico o múltiples idiomas nacionales.[recorteExcelente, CreateStdDispatch está
Crea una implementación estándar de la interfaz IDispatch a través de una sola llamada de función. Esto simplifica la exposición de objetos a través de la automatización.
HRESULT CreateStdDispatch(
IUnknown FAR* punkOuter,
void FAR* pvThis,
ITypeInfo FAR* ptinfo,
IUnknown FAR* FAR* ppunkStdDisp
);
i lo iba a llamar como:
CreateStdDispatch(
myUnk, //Pointer to the object's IUnknown implementation.
anotherObject, //Pointer to the object to expose.
nil //Pointer to the type information that describes the exposed object (i has no type info)
dispInterface //the IUnknown of the object that implements IDispatch for me
);
o que no puedo entender es cómo la implementación de la API de Windows deCreateStdDispatch
sabe qué métodos llamar a mi objeto, especialmente porqueCreateStdDispatch
no sabe qué lenguaje orientado a objetos estoy usando, o sus convenciones de llamadas.
CómoCreateStdDispatch
saber
dispid
?la convención de llamadas de mi idioma? ¿Cómo manejar excepciones del lenguaje en el que está escrito mi objeto orientado a objetos?Not: no tengo más remedio que implementar unadispinterface
; no definíLa interfa. desearía que fuera un simple inicio tempranoIUnknown
, pero no es así.