Visual C++中的简单回调函数

4
我是一名Linux程序员,对COM编程还不熟悉。我继承了一个程序,现在正在尝试修改它。我有一个IDL文件,其中包含以下dispinterface,我正在尝试在C++中设置回调函数。我在网上搜索了一些关于连接点的资料,但没有看到可以跟随的简单示例,所以我想知道是否有人可以帮助我。
dispinterface如下:
[
  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();
};

组件类:

[
  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
附言:如果需要更多信息,请让我知道,我会编辑此问题。谢谢。

请查看http://www.codeproject.com/KB/COM/intro_connectionpoints.aspx。 - Preet Sangha
那并没有太大帮助。1)我已经有了一个coclass(现在已添加到问题中)。2)VS2008没有显示“实现连接点…”选项。 - Jayen
你使用什么来实现coclass?MFC?ATL?MFC和ATL都有实现IConnectionPointContainer和IConnectionPoint等接口的工具,可以让你不至于失去理智。 - Logan Capaldo
我在问题中提到的 coclass 是来自于一个第三方软件,该软件已被继承程序使用。我尝试按照 Preet 给出的链接,并使用 ATL 为自己创建了一个示例 coclass,但这并没有对我有所帮助。 - Jayen
1个回答

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();

这个有意义吗?


是的,看起来很有道理。我会试一下并告诉你。我需要覆盖AddRef、Release和/或QueryInterface吗?现在我想知道第三方软件中的INotifySink接口有什么用处... - Jayen
你必须以某种方式实现它们(它们是纯虚函数)。 - Logan Capaldo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接