Сценарий таков:
- У меня есть 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.
Что я делаю не так?
Большое спасибо.
Майкл.