AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VC编程

COM中的可连接对象与连接点机制及其MFC程序实现

51自学网 2015-08-30 http://www.wanshiok.com

  2、编程实例

  现在用MFC实现一个可连接对象,然后写一个极为简单的客户和时间接收器。

  需要说明的是,MFC通过CCmdTarget类实现了IConnectionPointContainer和IEnumConnectionPoints接口,此外,通过CConnectionPoint类实现了IConnectionPoint接口

  1.可连接对象ConnObject

  在这个对象中,实现一个一般的COM接口IEventServer,客户可以使用此接口的方法DoSomething()作一些事情,但主要的是对象将在此处触发事件。SampleConnPoint实现连接点对象。

    (1)在GUIDs.h中写入:

// {EE888B01-EA9C-11d3-97B5-5254AB191930}

static const IID CLSID_ConnObject = //组件ID

{ 0xee888b01, 0xea9c, 0x11d3, { 0x97, 0xb5, 0x52, 0x54, 0xab, 0x19, 0x19, 0x30 } };

// {EE888B02-EA9C-11d3-97B5-5254AB191930}

static const IID IID_IEventServer = //一般的COM接口,客户使用此接口的方法

//DoSomething()

{ 0xee888b02, 0xea9c, 0x11d3, { 0x97, 0xb5, 0x52, 0x54, 0xab, 0x19, 0x19, 0x30 } };


//// {EE888B03-EA9C-11d3-97B5-5254AB191930}

static const IID IID_IEventSink = //连接点对象所实现的连接点接口ID

{ 0xee888b03, 0xea9c, 0x11d3, { 0x97, 0xb5, 0x52, 0x54, 0xab, 0x19, 0x19, 0x30 } };

  2. 在IConnObject.h中写入

#include "GUIDs.h"

//声明IEventServer接口

DECLARE_INTERFACE_(IEventServer,IUnknown)

{

STDMETHOD(DoSomething)()PURE;

};

//声明出接口,此出接口将由客户的事件接收器实现

DECLARE_INTERFACE_(IEventSink,IUnknown)

{

STDMETHOD(EventHandle)()PURE;

};

  3.添加基类为CCmdTarget的类CConnObject.在类声明文件CConnObject1.h中加上#include “IConnObject.h”,在类声明中写入:

protected:

……

//声明实现IEventServer接口的嵌套类

BEGIN_INTERFACE_PART(EventServer,IEventServer)

STDMETHOD(DoSomething)();

END_INTERFACE_PART(EventServer)

DECLARE_INTERFACE_MAP()

//声明实现连接点的嵌套类

BEGIN_CONNECTION_PART(CConnObject,SampleConnPoint)

CONNECTION_IID(IID_IEventSink)

END_CONNECTION_PART(SampleConnPoint)

DECLARE_CONNECTION_MAP()

DECLARE_OLECREATE(CConnObject)

  说明:BEGIN_CONNECTION_PART和END_CONNECTION_PART宏声明了实现连接点的嵌套类SampleConnPoint,并且是基于CConnectionPoint类的,如果需要重载CConnectionPoint类的成员函数或者添加自己的成员函数,可以在这两个宏中声明.这里,CONNECTION_IID宏重载了CConnectionPoint::GetIID()函数.使用DECLARE_CONNECTION-MAP()宏声明连接点映射表.

  4.在类CConnObject的实现文件中写入

IMPLEMENT_OLECREATE(CConnObject,"ConnObject",

0xee888b01, 0xea9c, 0x11d3, 0x97, 0xb5, 0x52, 0x54, 0xab, 0x19, 0x19, 0x30);

BEGIN_INTERFACE_MAP(CConnObject,CCmdTarget)

INTERFACE_PART(CConnObject,IID_IEventServer,EventServer)

INTERFACE_PART(CConnObject,IID_IConnectionPointContainer,ConnPtContainer)

END_INTERFACE_MAP()

BEGIN_CONNECTION_MAP(CConnObject,CCmdTarget)

CONNECTION_PART(CConnObject,IID_IEventSink,SampleConnPoint)

END_CONNECTION_MAP()

说明:A.必须在接口映射中写入INTERFACE_PART(CConnObject,IID_IConnectionPointContainer,ConnPtContainer)以实现IConnectionPointContainer接口.注意,CCmdTarget类内嵌有才ConnPtContainer类以实现IConnectionPointContainer接口,并用m_xConnPtContainer加以记录.

B.用BEGIN_CONNECTION_MAP和END_CONNECTION_MAP宏实现连接点映射.CONNECTION_PART定义了实现连接点的类.

  5.在CConnObject::CConnObject()中写入:

EnableConnections();

  6.实现IEventServer接口

  IEventServer接口是基于IUnknown接口的,实现IUnknown接口的方法这里不在赘述.在实现文件中写入:

STDMETHODIMP

CConnObject::XEventServer::DoSomething()

{

//DoSomething

METHOD_PROLOGUE(CConnObject,EventServer)

pThis->FireEvent();

return S_OK;

}

DoSomething()方法可以为客户提供需要的服务.这里着重的是可连接对象在此处触发客户事件接收器的事件,FireEvent()函数是ConnObject类实现的专门触发事件的的函数,代码如下:

void CConnObject::FireEvent()

{

//获取连接点上的连接指针队列

const CPtrArray* pConnections = m_xSampleConnPoint.GetConnections();

ASSERT(pConnections!=NULL);

int cConnections = pConnections->GetSize();

IEventSink* pIEventSink;

//对每一个连接触发事件

for(int i = 0; i < cConnections; i++)

{

//获取客户事件接收器接口指针

pIEventSink = (IEventSink*)(pConnections->GetAt(i));

ASSERT(pIEventSink!=NULL);

//调用客户事件接受器事件处理函数

//此函数是出接口定义,由客户事件接收器实现的

pIEventSink->EventHandle();

}

}

 
 
说明
:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。

上一篇:在VC++6.0中用MFC进行COM编程  下一篇:WIN32用户界面设计基础之Icon篇