技术开发 频道

使用.NET应用的Classic COM组件


创建ATL COM组件


    让我们来看一下,COM 中的连接点事件处理机制是怎样翻译成.NET世界中委托事件处理机制的。同时也让我们来看一下看怎样使用.NET 托管 事件接受来检查事件通知,此事件通知是由COM对象发送来的。首先,让我们来研究COM对象,它正在向你的.NET应用程序的事件源运行。无论什么时候,只要航线到达一个假定的飞机场(此飞机场都被称为John Doe International Airport)时,让我们创建一个简单的COM对象(此COM对象将呼叫你的.NET应用程序)。我们将先从我们的.NET应用程序预定这个服务,因此,无论飞机什么时候在John Doe机场的跑道上着陆都可以传呼。


   
    创建一个ATL EXE项目,此ATL EXE项目装有一个AirlineArrivalPager对象。AirlineArrivalPager对象支持输入接口(此接口被称为IAirlineArrivalPager)和输出的接口(此接口被称为IAirlineArrivalPagerEvents)。这里是IAirlineArrivalPagerEvents 输出接口的接口定义。在coclass定义中,这个接口被标记有[source]属性。

..... 

interface IAirlineArrivalPager : IDispatch
{
[id(1), helpstring("method AddArrivalDetails")]
HRESULT AddArrivalDetails([in] BSTR bstrAirlineName,
[in] BSTR bstrArrivalTerminal);
};

....

dispinterface _IAirlineArrivalPagerEvents
{
properties:
methods:
[id(1), helpstring("method OnAirlineArrivedEvent")]
HRESULT OnAirlineArrivedEvent([in] BSTR bstrAirlineName,
[in] BSTR bstrArrivalTerminal);
};

....

coclass AirlineArrivalPager
{
[default] interface IAirlineArrivalPager;
[default, source] dispinterface _IAirlineArrivalPagerEvents;
};

.......
输入IAirlineArrivalPager接口的AddArrivalDetails方法的执行情况。

....... 
STDMETHODIMP CAirlineArrivalPager::AddArrivalDetails(
BSTR bstrAirlineName,BSTR bstrArrivalTerminal)
{
Fire_OnAirlineArrivedEvent(bstrAirlineName,bstrArrivalTerminal);

// 返回状态
return S_OK;
}
.......
    这个方法的执行情况使用了Fire_OnAirlineArrivedEvent帮助程序方法,以此来通报所有接受对象执行IAirlineArrivalPagerEvents,IAirlineArrivalPagerEvents早已预定了事件通知通知。Fire_OnAirlineArrivedEvent是一个函数代理类型方法,通过Implement Connection point wizard,自动地从IConnectionPointImpl派生而来。本质上,当IConnectionPoint::Advise被调用时,它通过映射迭代,这个映射把接口指针存储到接受对象,使用这些接口指针来调用事件通知方法(OnAirlineArrivedEvent),此事件通知方法由客户端接受对象执行。
0
相关文章