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.[recorteExcellent, 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
dispid
?a convenção de chamada do meu idioma?omo lidar com exceções da linguagem na qual meu objeto orientado a objetos está escritNot: 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 é.