学习C#的时候,最喜欢的就是event关键字,因为事件处理变得很轻松。以往在C++里,我们一般是使用回调函数或者虚函数(接口),虽然也挺方便,但是如果有多个事件接收者就比较麻烦了,而且每个人实现的回调方式都不一样。在COM编程模型里的连接点也很好,允许多个事件接收者,甚至利用COM的机制跨进程回调通知,可惜实现太负责,调用也麻烦。最好还是像C#的event关键字,清晰明了。
在尝试使用Attribute编写COM组件的时候,发现原来微软在VC++里增加很多关键字,用以简化和统一事件模型。这样使用同样的语法,就可以同时处理Native,COM和Managed的事件!
为了利用VC++的这个新特性(好像2000年就出来了,不算新啦,见笑见笑),今天郁闷了一天,现在终于搞定了,总结一下。
事件的定义和触发
__interface _IMyEventSink
{
HRESULT SomethingHappened();
};
[coclass,event_source(com)] //关键是event_source(com)
class MySourceObject
{
__event __interface _IMyEventSink; //跟C#的语法一样
void DoSomething()
{
__raise SomethingHappened(); //直接调用事件接口里的方法。
}
};
在尝试使用Attribute编写COM组件的时候,发现原来微软在VC++里增加很多关键字,用以简化和统一事件模型。这样使用同样的语法,就可以同时处理Native,COM和Managed的事件!
为了利用VC++的这个新特性(好像2000年就出来了,不算新啦,见笑见笑),今天郁闷了一天,现在终于搞定了,总结一下。
事件的定义和触发
__interface _IMyEventSink
{
HRESULT SomethingHappened();
};
[coclass,event_source(com)] //关键是event_source(com)
class MySourceObject
{
__event __interface _IMyEventSink; //跟C#的语法一样
void DoSomething()
{
__raise SomethingHappened(); //直接调用事件接口里的方法。
}
};