COM组件设计与应用(十五)——连接点(vc6.0)

本文配套源码

一、前言

上回书介绍了回调接口,在此基础上,我们理解连接点就容易多了。

二、原理

图一、连接点组件原理图。左侧为客户端,右侧为服务端(组件对象)

看着好复杂呀......呵呵,其实简单的紧:(注1)

1、一个 COM 组件,允许有多个连接点对象(IConnectionPoint)。

也就是说可以有多个发生“事件”的源头。上图就有3个连接点;

2、管理这些连接点的接口叫“连接点容器”(IConnectionPointContainer)。

连接点容器接口特别简单,因为只有2个函数,一个是 FindConnectionPoint(),表示查找你想要的连接点;另一个是 EnumConnectionPoints(),表示列出所有的连接点,然后你去选择使用哪个。在实际的应用中,查找法使用最多,占90%,而枚举法使用只占 10%,一般在支持第三方的插件(Plug in)时才使用。(你想写个 IE 的插件吗?我们后面就要讲到啦)

3、每一个连接点,可以被多个客户端的接收器(Sink)连接;

这个我们已经熟悉啦,还记得我们在上回书中为了管理多个回调接口,使用了 cookie 的方式进行区别吗?!

三、实现组件(一)

1、建立一个工作区(WorkSpace)

2、在工作区中,建立一个 ATL 工程(Project)。示例程序中工程名称叫 Simple15,接受全部默认选项。

3、ClassView 中,执行鼠标右键菜单命令 New Atl Object...,添加 ALT 类。

4、左侧分类 Category 选择 Objects,右侧 Objects 选择 SimpleObject(其实就是默认项目)。

5、名称 Name 卡片中,输入组件名称。示例程序中是 DispConnect。

6、属性 Attributes 卡片中,接口类型选 Dual 双接口。注意一定要选择 Support Connection Points 来支持连接点。

时间: 2024-10-24 01:55:54

COM组件设计与应用(十五)——连接点(vc6.0)的相关文章

COM组件设计与应用(十六)——连接点(vc.net)

本文配套源码 一.前言 上回书介绍了回调接口,在此基础上,我们理解连接点就容易多了. 二.原理 图一.连接点组件原理图.左侧为客户端,右侧为服务端(组件对象) 看着好复杂呀......呵呵,其实简单的紧:(注1) 1.一个 COM 组件,允许有多个连接点对象(IConnectionPoint). 也就是说可以有多个发生"事件"的源头.上图就有3个连接点: 2.管理这些连接点的接口叫"连接点容器"(IConnectionPointContainer). 连接点容器接口

COM组件设计与应用(十八)——属性包

本文配套源码 一.前言 书接上回,本回着落在介绍属性包 IPersistPropertyBag 接口的实现方法和调用方式.属性包,是以"名称 - 值"的方式提供组件持续性的支持,而"名称 - 值"恰恰又适合于用文本方式来表现.下面的片段是在 HTML 中插入 Microsoft MonthView Control ActiveX 控件后的样式: <object classid="clsid:232E456A-87C3-11D1-8BE3-0000F8

COM组件设计与应用(十四)——事件和通知(vc.net)

本文配套源码 一.前言 我的 COM 组件运行时产生一个窗口,当用户双击该窗口的时候,我需要通知调用者: 我的 COM 组件用线程方式下载网络上的一个文件,当我完成任务后,需要通知调用者: 我的 COM 组件完成一个钟表的功能,当预定时间到达的时候,我需要通知调用者: ... ... ... ... 本回书开始话说 COM 的事件.通知.连接点......这些内容比较多,我分两次(共四回)来介绍. 二.通知的方法 当程序甲方内部发生了某个事件的时候,需要通知乙方,无非使用几个方法: 通知方式 简

网页教学网推荐:常用网页设计效果代码十五例

设计|网页|网页设计 1.忽视右键 <body oncontextmenu="return false"> 或 <body style="overflow-y:hidden"> 2.加入背景音乐 IE:<bgsound src="*.mid" loop=infinite> NS:<embed src="*.mid" autostart=true hidden=true loop=tru

COM组件设计与应用(十二)——错误与异常处理

本文配套源码 一.前言 程序设计中,错误处理必不可少,而且通常要占用很大的篇幅.本回书着落在 COM 中的错误(异常)的处理方法. 在组件程序中,如果遇到错误,一般有两个方式进行处理. 二.简单返回 对于比较简单的错误,直接返回表示错误原因的 HRESULT.比如下面几个就是常见的错误值: E_INVALIDARG 0x80070057 参数错误 E_OUTOFMEMORY 0x8007000E 内存错误 E_NOTIMPL 0x80004001 未实现 E_POINTER 0x80004003

数据库组件 Hxj.Data (十五) (查询的排序、分组)

本节将讲述查询的排序(order by) 和 分组(group by). 先说排序 在分页中如果没有指定排序,组件会默认一个排序来实现分页. 例如 DbSession.Default.From<Products>() .Page(10, 2) .Where(Products._.CategoryID.SelectIn(1, 2, 3)) .ToList(); 生成的sql如下: Text: SELECT * FROM ( SELECT TOP 10 * FROM ( SELECT TOP 20

Spark修炼之道(进阶篇)——Spark入门到精通:第十五节 Kafka 0.8.2.1 集群搭建

作者:周志湖 微信号:zhouzhihubeyond 本节为下一节Kafka与Spark Streaming做铺垫 主要内容 1.kafka 集群搭建 1. kafka 集群搭建 kafka 安装与配置 到下面的地址下载:Scala 2.10 - kafka_2.10-0.8.2.1.tgz http://kafka.apache.org/downloads.html 下载完成后,使用命令 tar -zxvf kafka_2.10-0.8.2.1.tgz 解压,解压后的目录如下 进入config

微信小程序把玩(二十五)loading组件

原文:微信小程序把玩(二十五)loading组件 loading通常使用在请求网络数据时的一种方式,通过hidden属性设置显示与否 主要属性: wxml <!----> <button type="primary" bindtap="listenerButton">显示loading</button> <!--默认隐藏--> <loading hidden="{{hiddenLoading}}&quo

我心中的核心组件(可插拔的AOP)~第十五回 我的日志组件Logger.Core(策略,模版方法,工厂,单例等模式的使用)

之前的讲过两篇关于日志组件的文章,分别是<第一回  日志记录组件之自主的Vlog>和<第三回  日志记录组件之log4net>,而今天主要说一下我自己开发的另一种日志组件Logger.Core,它也属于面试AOP(横切关注点)的一部分,这个组件对于一些想学习设计模式的同学来说,无疑是一个大餐!Logger.Core项目里内含了策略模式,模版方法模式,工厂模式和单例模式,可以说,最常用的模式都用到了,而它们在这个项目里都起到了什么作用,什么时候用到它们呢,这些答案相信在看完我的文章之