C++ DispInvoke 找不到成员

发布于 2024-12-01 07:22:21 字数 908 浏览 0 评论 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);

How do I generated m_ptinfo?通过使用 COM 对象的 libid 调用 LoadRegTypeLib,然后使用 IComEvents 的 IID 调用 ITypeLib::GetTypeInfoOfGuid()。但是,DispInvoke() 始终返回“未找到成员”。

会有什么问题吗?我希望DispInvoke解析类型信息,从DispID中找到成员函数名,然后使用“this”指针从vtbl中获取函数地址。

我做错了什么?

多谢。 迈克尔.

The scenario is this:

  • I have a COM object to ask questions. Name it ICom.
  • The COM object requires me to implement an IDispatch , descendant of , say, IComEvents, that notifies me for events.
  • I implement an IDispatch and connect it to the COM interface.

So far so good. My IComEvents descentant's Invoke() is called when the events occur.

The point is now that I must manually parse Invoke() parameters. For example, if a notification function is HRESULT OnMouseHit(int x), I have to detect this function from the DispID, then call it manually, for example

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

I would have to do it for all the functions I want to implement. However I saw the DispInvoke() function which presumably will automatically do this for me and call the appropriate overloaded method for the dispId, with the correct parameters:

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

How do I generate m_ptinfo? By calling LoadRegTypeLib with the libid of the COM object, and then ITypeLib::GetTypeInfoOfGuid() with the IID of IComEvents. However, DispInvoke() always returns "member not found".

What would be wrong? I expect DispInvoke to parse the type information, find the member function name from the DispID and then use the "this" pointer to get the function address from the vtbl.

What am I doing wrong?

Thanks a lot.
Michael.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

初熏 2024-12-08 07:22:21

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

Is IComEvents a dual interface or a dispinterface? If it is a pure dispinterface it doesn't have a vtable. DispInvoke requires the interface to have a vtable (ie that it is a dual interface).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文