接收COM事件而不手动将dispid映射到方法

时间:2011-08-09 16:41:54

标签: delphi events com delphi-xe

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

所以基本上我这样做:

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

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

这意味着我不想在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

任何提示?

1 个答案:

答案 0 :(得分:1)

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

你可以also see my question;我呻吟着不得不写下你所面对的写作。