¿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.[recorte

Excelente, 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

qué método llamar para un @ dadispid?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í.

Respuestas a la pregunta(1)

Su respuesta a la pregunta