0

场景是这样的:

  • 我有一个 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 中获取函数地址。

我究竟做错了什么?

非常感谢。迈克尔。

4

1 回答 1

0

IComEvents双接口还是分接口?如果它是纯调度接口,则它没有 vtable。DispInvoke要求接口有一个vtable(即它是一个双接口)。

于 2011-08-25T15:17:37.170 回答