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