连接点
本文说明如何实现连接点 (,以前称为 OLE 连接点) 使用 MFC 类 CCmdTarget 和 CConnectionPoint,。
过去,组件对象 (COM)模型 (com) 定义允许对象实现并显示接口中的函数的泛型结构 (IUnknown::QueryInterface)。 不过,允许对象公开其功能调用特定接口的一个对应的结构未定义。 即 COM 中定义的对象 (对该对象的接口指针的传入的指针) 的处理方式,则为; 但没有输出接口 (对象持有对其他对象的接口) 的指针显式模型。 COM 现在具有一个模型,称为联接,支持此功能。
连接由两部分组成:调用接口的对象,调用源和实现接口的对象,调用接收器。 连接点作为源公开的接口。 通过显示连接点,源允许接收器生成与自身的连接 (源)。 通过连接点机制 ( IConnectionPoint 界面),指向接收接口传递给数据源对象。 此指针提供数据源提供对接收器实现的访问设置成员函数。 例如,通过调用接收器实现的事件,源可以调用接收器的实现的相应方法。 下图演示连接点描述。
已实现的连接点
MFC 实现在 CConnectionPoint 和 CCmdTarget 类的此模型。 从 CConnectionPoint 派生的类实现 IConnectionPoint 接口,用于显示连接点对其他对象。 从 CCmdTarget 派生的类实现 IConnectionPointContainer 接口,可以枚举所有对象的可用连接点或查找特定连接点。
对于每个连接点实现在类中,必须声明实现连接点的连接部件。 如果实现一个或多个连接点,还必须声明类的唯一的连接映射。 连接映射是表连接点支持 Activex 控件。
下面的示例演示简单的连接映射,然后提供方控件。 第一个示例声明连接映射点;第二个示例实现映射点。 请注意 CMyClass必须是 CCmdTarget派生类。 在第一个示例中,代码隐藏类声明中插入,在 受保护 部分:
class CMyClass : public CCmdTarget
{
protected:
// Connection point for ISample interface
BEGIN_CONNECTION_PART(CMyClass, SampleConnPt)
CONNECTION_IID(IID_ISampleSink)
END_CONNECTION_PART(SampleConnPt)
DECLARE_CONNECTION_MAP()
BEGIN_CONNECTION_PART 和 END_CONNECTION_PART 宏声明嵌入类, XSampleConnPt (从派生 CConnectionPoint),实现此特定连接点。 如果要重写任何 CConnectionPoint 成员函数或添加您的成员函数,声明它们在这两个宏之间。 例如, CONNECTION_IID 宏重写 CConnectionPoint::GetIID 成员函数,放置在这两个宏之间。
在第二个示例中,代码在控件中实现文件 (.cpp 文件) 插入。 此代码实现连接映射,包括连接点, SampleConnPt:
BEGIN_CONNECTION_MAP(CMyClass, CCmdTarget)
CONNECTION_PART(CMyClass, IID_ISampleSink, SampleConnPt)
END_CONNECTION_MAP()
如果您的类有多个提供方控件,在 BEGIN_CONNECTION_MAP 和 END_CONNECTION_MAP 宏之间插入附加 CONNECTION_PART 宏。
最后,将之后添加到类的构造函数 EnableConnections 。 例如:
CMyClass::CMyClass()
{
EnableConnections();
}
对于插入了此代码后,您的 CCmdTarget派生的类公开为 ISampleSink 接口的连接点。 下图阐释了此示例。
连接点实现与 MFC
通常,连接点支持 “多路广播” —能够广播到多个接收器连接到同一接口。 下面的示例片段演示如何通过重复多路广播通过中的每个接收器连接点:
void CMyClass::CallSinkFunc()
{
POSITION pos = m_xSampleConnPt.GetStartPosition();
ISampleSink* pSampleSink;
while( pos != NULL )
{
pSampleSink = (ISampleSink*)(m_xSampleConnPt.GetNextConnection(pos));
if(pSampleSink != NULL)
pSampleSink->SinkFunc();
}
}
此示例检索当前设置在 SampleConnPt 的连接连接点用于对 CConnectionPoint::GetConnections。 它通过连接然后重复并对每个活动连接的 ISampleSink::SinkFunc 。