C ++ DispInvoke не может найти участника - PullRequest
0 голосов
/ 25 августа 2011

Сценарий таков:

  • У меня есть COM-объект, чтобы задавать вопросы. Назовите это ICom.
  • COM-объект требует от меня реализации IDispatch, потомка, скажем, IComEvents, который уведомляет меня о событиях.
  • Я реализую IDispatch и подключаю его к интерфейсу COM.

Пока все хорошо. Invoke () моего потомка IComEvents вызывается, когда происходят события.

Суть в том, что теперь я должен вручную анализировать параметры Invoke (). Например, если функция уведомления HRESULT OnMouseHit (int x), я должен обнаружить эту функцию по DispID, а затем вызвать ее вручную, например

if (dispIdMember == 0xfa)
 {
 OnMouseHit(pDispParams->rgvarg[0].pIntVal); 
 }

Я бы сделал это для всех функций, которые я хочу реализовать. Однако я видел функцию DispInvoke (), которая, предположительно, автоматически сделает это для меня и вызовет соответствующий перегруженный метод для dispId с правильными параметрами:

DispInvoke(this,m_ptinfo,dispIdMember,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);

Как мне сгенерировать m_ptinfo? Вызывая LoadRegTypeLib с libid объекта COM, а затем ITypeLib :: GetTypeInfoOfGuid () с IID IComEvents. Однако DispInvoke () всегда возвращает «элемент не найден».

Что будет не так? Я ожидаю, что DispInvoke проанализирует информацию о типе, найдет имя функции-члена из DispID и затем использует указатель «this», чтобы получить адрес функции из vtbl.

Что я делаю не так?

Большое спасибо. Майкл.

1 Ответ

0 голосов
/ 25 августа 2011

IComEvents это двойной интерфейс или интерфейс?Если это чистый интерфейс, у него нет vtable.DispInvoke требует, чтобы интерфейс имел vtable (т. Е. Это двойной интерфейс).

...