【发布时间】: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 -> Import Component -> Type Library? -
嗯,是的,我做到了。您是否暗示可以在那里找到解决方案?会检查的。
-
嗯,这些东西,如果你选择它,它将在你创建的 MyThing_TLB.pas 中。
标签: delphi events com delphi-xe