Недавно я смотрел, как работает IDispatch
. Ниже приведен пример того, как клиент автоматизации может вызывать метод объекта сервера автоматизации, который реализует IDispatch
:
HRESULT hresult;
IDispatch * pdisp = (IDispatch *)NULL;
DISPID dispid;
OLECHAR * szMember = "color";
// Code that sets a pointer to the dispatch (pdisp) is omitted.
hresult = pdisp->GetIDsOfNames(
IID_NULL,
&szMember,
1, LOCALE_SYSTEM_DEFAULT,
&dispid);
pdisp->Invoke(
dispid,
...
)
При внедрении сервера это подсказывает мне, что вы можете реализовать GetIDOfNames
как:
HRESULT GetIDsOfNames(
REFIID riid,
LPOLESTR *rgszNames,
UINT cNames,
LCID lcid,
DISPID *rgDispId
){
rgDispId = 10;
return S_OK;
};
Таким образом, мы, по сути, говорим клиенту, что все вызовы методов в порядке, и все вызовы методов будут вызывать метод с DISPID==10
.
myObject->a();
myObject->ab();
myObject->abc();
myObject->abcd();
//^^ Are all valid and will all call DispID 10.
Итак, мой вопрос: можем ли мы как-то сохранить имя, которое было вызвано, так, чтобы наш метод DispID 10 знал, какой метод вызывается?
Примечание. Конечная цель этого состоит в том, чтобы создать COM-сервер, который может быть COM-сервером для других COM-клиентов, у которых может отсутствовать возможность / знания самих COM-серверов.