Возможен ли пользовательский IDispatch с собственным метапрограммированием? - PullRequest
0 голосов
/ 25 января 2019

Недавно я смотрел, как работает 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-серверов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...