Como CreateStdDispatch sabe qual método chamar?

sou confrontado com a implementação de umIDispatch interface. Existem quatro métodos, e felizmente 3 deles são fáceis:

function TIEEventsSink.GetTypeInfoCount(...): HResult;
{
   Result := E_NOTIMPL;
}

function TIEEventsSink.GetTypeInfo(...): HResult;
{
   Result := E_NOTIMPL;
}

function TIEEventsSink.GetIDsOfNames(...): HResult;
{
   Result := E_NOTIMPL;
}

É o último método,Invoke isso é difícil. Aqui estou confrontado com a necessidade de, na verdade, o caso DispID e chame meu método apropriado; sem remoção de parâmetros de uma 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;

Não quero ter que escrever todo o código tedioso do clichê, que tenho certeza de que haverá bugs, fui pesquisar no Google - em vez de fazer qualquer trabalh

i encontrei este snippit em documentação do MSDN deIDispatch.Invoke:

Geralmente, você não deve implementarInvoca diretament

Excelente! eu não queria implementá-lo de qualquer maneira! Leitura contínua:

Em vez disso, use a interface de despacho para criar funções CreateStdDispatch e DispInvoke. Para detalhes, consulte CreateStdDispatch, DispInvoke, Criando a interface IDispatch eExposição de objetos ActiveX.

O Criando a interface IDispatch link diz:

Você pode implementar o IDispatch de qualquer um dos seguintes meios:

[recorteChamando o CreateStdDispatch função. Essa abordagem é a mais simples, mas não fornece tratamento avançado de erros ou vários idiomas nacionais.[recorte

Excellent, CreateStdDispatch isto é

Cria uma implementação padrão da interface IDispatch através de uma única chamada de função. Isso simplifica a exposição de objetos por meio da automaçã

HRESULT CreateStdDispatch(  
  IUnknown FAR*  punkOuter,        
  void FAR*  pvThis,               
  ITypeInfo FAR*  ptinfo,          
  IUnknown FAR* FAR* ppunkStdDisp  
);

i ia chamá-lo 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 eu não consigo descobrir é como a implementação da API do Windows emCreateStdDispatch sabe quais métodos chamar no meu objeto - especialmente desde queCreateStdDispatch não sabe qual linguagem orientada a objetos estou usando ou suas convenções de chamad

Como vaiCreateStdDispatch conhece

que método para chamar um determinadodispid?a convenção de chamada do meu idioma?omo lidar com exceções da linguagem na qual meu objeto orientado a objetos está escrit

Not: não tenho escolha a não ser implementar umdispinterface; eu não definia interfac. eu gostaria que fosse um simples início ligadoIUnknown, mas não é.

questionAnswers(1)

yourAnswerToTheQuestion