【问题标题】:Sink COM events without mapping dispids manually to methods接收 COM 事件而不手动将 dispids 映射到方法
【发布时间】:2011-10-23 09:42:14
【问题描述】:

我有一个IConnectionPointContainer 并且知道我想要接收其事件的连接点。现在我需要为这些事件编写一个包含回调方法的类。

所以基本上我是这样做的:

OleCheck((ExtIntf as IConnectionPointContainer).FindConnectionPoint(IID_IEvents, cp));
OleCheck(cp.Advise(MySink {<--this one I need}, Cookie));

我需要提供MySink,并且我知道该怎么做才能调用MyIntf.Invoke。但我不想手动将 dispids 映射到事件方法。

这意味着我不想在我的Invoke 中这样做:

// Handle the event
case DispID of
  102   :  OnStatusTextChange(pdpParams^.rgvarg^[lpDispIds[0]].bstrval);
  104   :  OnDownloadComplete;
  105   :  OnCommandStateChange(pdpParams^.rgvarg^[lpDispIds[0]].lval,
                                pdpParams^.rgvarg^[lpDispIds[1]].vbool);
  106   :  OnDownloadBegin;
  108   :  OnProgressChange(pdpParams^.rgvarg^[lpDispIds[0]].lval,
                            pdpParams^.rgvarg^[lpDispIds[1]].lval);
  112   :  OnPropertyChange(pdpParams^.rgvarg^[lpDispIds[0]].bstrval);
  {... doh}

对于连接点IID_IEvents,我同时拥有接口IEvents 和dispinterface 声明(来自Delphi 类型库导入)。我不能以某种方式实现IEvents 吗?我想要一个包含方法的干净类,每个方法都是IID_IEvents 连接点提供的事件之一的回调。

我非常希望有人知道

  • 我可以继承的基类负责调用我的事件方法
  • 一个为我创建适当类的 Delphi 向导
  • 我需要制作我的魔杖才能最终掌握 COM 的树

有什么建议吗?

【问题讨论】:

  • 这是一个很好的问题!我相信您希望自动生成一个实现 IDispatch 的双接口事件接收器类,并且您应该能够使用类型库导入器为您完成它。
  • @Warren 谢谢,我真的希望有人有灵感让我们的生活更轻松 :) 不想再处理 dispids :(
  • 你是不是已经像往常一样Component -&gt; Import Component -&gt; Type Library?
  • 嗯,是的,我做到了。您是否暗示可以在那里找到解决方案?会检查的。
  • 嗯,这些东西,如果你选择它,它将在你创建的 MyThing_TLB.pas 中。

标签: delphi events com delphi-xe


【解决方案1】:

TechVanguards 有一个为您生成代码的工具:COM Sink Event Generator

你可以also see my question;我抱怨不得不写下你所面临的写作。

【讨论】:

  • 感谢 Ian,生成器就是解决方案!我之前忽略了它,因为最后一次更新是在 2002 年。但对于已有十多年历史的 COM,这似乎无关紧要。
  • 我记得微软有人说过,“COM 没有死,但它已经完成了”。没有添加任何新内容。但是 Windows 的大多数新功能仍然通过 COM 接口暴露出来。
猜你喜欢
  • 2020-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多