visual c ++中的简单回调

时间:2010-11-30 00:12:35

标签: events visual-c++ com event-handling callback

我是Linux程序员,是COM编程的新手,我继承了一个我正在尝试修改的程序。我有一个带有以下dispinterface的IDL文件,我正在尝试在C ++中设置回调。我一直在网上搜索,我发现了一些连接点的东西,但我没有看到一个可以遵循的简单例子,所以我想知道有人可以帮助我。

调度接口:

[
  helpstring("Event interface"),
  helpcontext(0x00000006)
]
dispinterface _DEvents {
    properties:
    methods:
        [id(0x00000001), helpstring("Occurs when about to begin."), helpcontext(0x0000000d)]
        void Starting();
        [id(0x00000002), helpstring("Occurs at the beginning."), helpcontext(0x00000011)]
        void Begin();
        [id(0x00000003), helpstring("Occurs at the end."), helpcontext(0x00000012)]
        void End();
};

coclass:

[
  helpstring("C Class"),
  helpcontext(0x0000009e)
]
coclass C {
    [default] interface IE;
    [default, source] dispinterface _DEvents;
};

接收器接口:

[
  odl
]
interface INotifySink : IUnknown {
    HRESULT _stdcall Starting();
    HRESULT _stdcall Begin();
    HRESULT _stdcall End();
};

我发现了这两篇文章,但我不能对它们做出正面或反面:

我想我必须创建一个扩展INotifySink的新类,并实现这些功能,但之后我该怎么办?

谢谢, Jayen

P.S。如果我需要提供更多信息,请告诉我,我将编辑此问题。感谢。

1 个答案:

答案 0 :(得分:1)

您是否在询问如何消费现存的coclass事件?为此,您需要创建一个实现_DEvents接口的对象,而不是新接口。

类似的东西:

 class EventSink : public _DEvents
 {
     AddRef() { ... }
     Release() { ... }
     QueryInterface(...) { ... }
     Starting() { printf("Starting happend\n"); }
     Begin() { ... }
     End() { ... }
 }
 EventSink *es = new EventSink;
 IE *objectOfInterest = ...;
 IConnectionPointContainer *cpc;
 objectOfInterest->QueryInterface(&cpc);
 IConnectionPoint *cp;
 cpc->FindConnectionPoint(__uuidof(_DEvents), &cp);
 cp->Advise(es, &cookie);
 objectOfInterest->somethingthatfiresanevent();

这有意义吗?