学习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(); //直接调用事件接口里的方法。
}
};
事件的接收,有两种办法,你可以单独接收某个事件(接口里的一个方法),或者接收事件接口里的所有方法。前者比较灵活,后者比较省事。
#import "mycom.dll" no_namespace embedded_idl
//如
在尝试使用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(); //直接调用事件接口里的方法。
}
};
事件的接收,有两种办法,你可以单独接收某个事件(接口里的一个方法),或者接收事件接口里的所有方法。前者比较灵活,后者比较省事。
#import "mycom.dll" no_namespace embedded_idl
//如

本文介绍了如何在VC++中使用COM连接点来实现事件处理,通过__event、__interface、__hook等关键字简化了Native、COM和Managed事件的处理。示例展示了如何定义事件源、触发事件以及作为事件接收者进行事件订阅,强调了event_source(com)和event_receiver(com)的作用。文章还提到了使用attribute编写的COM组件,并提醒在使用#import时注意embedded_idl参数的影响。
最低0.47元/天 解锁文章
2478

被折叠的 条评论
为什么被折叠?



