场景是这样的:
- 我有一个 COM 对象来提问。将其命名为 ICom。
- COM 对象要求我实现一个 IDispatch,它是 IComEvents 的后代,它会通知我发生事件。
- 我实现了一个 IDispatch 并将其连接到 COM 接口。
到现在为止还挺好。我的 IComEvents 后裔的 Invoke() 在事件发生时被调用。
现在的重点是我必须手动解析 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?通过使用 COM 对象的 libid 调用 LoadRegTypeLib,然后使用 IComEvents 的 IID 调用 ITypeLib::GetTypeInfoOfGuid()。但是,DispInvoke() 总是返回“找不到成员”。
会有什么问题?我希望 DispInvoke 解析类型信息,从 DispID 中找到成员函数名,然后使用“this”指针从 vtbl 中获取函数地址。
我究竟做错了什么?
非常感谢。迈克尔。