COM学习笔记之IUNKNOWN
呵呵,今天晚上的网速巨快,平时习惯了盯着浏览器左下角的进度条,今天一看,傻了眼了,一闪就到头了,呵呵,爽就一个字啊,正好今晚继续我的COM之旅。
今天我还是要讲COM,从如何实现一个基本的COM框架入手,一点一点的感觉COM带给我们的便利,同时也感受着程序设计的艺术与魅力。
事先声明,以下观点实属本人自己的思想,不具有可靠的理论依据,我只是想用最简单的方法记住这样一种比较复杂的结构。所以会用一些可能不是很恰当的比方,但是我觉得适合我,呵呵。
还记得我刚开始拿到《VC6技术内幕》时,里面一开始就是一个飞船的例子,其中就有一个IUNKNOW的东西,我实在是被它搞得找不着北了,为什么要去学COM呢,就我而言,是因为要做DirectShow一些开发,没有办法,它全是基于COM的,虽然我会用它写程序,而且也能实现一些功能了,但是还是不明白,它那些看起来无所不能的函数QueryInterface(),到底做了些什么?我只是知道,我先用CreateInstance创建一个实例,然后再用它的QueryInterface()得到我想要的一些看起来像是对象的指针,然后再用这些指针->再调用一些函数来完成一些功能,我所知道的就这么多,但是就是这么点东西,我却做出了一个可以运行的程序,而且可以把摄像头捕捉到的画面显示出来了,这在我看来是有点不可想像,整个DirectShow对我来说就像是一个黑箱子,我只是按照它给我留的一个个口,每个口都贴了标签以说明它里面的东西是干什么的,于是我伸手进去拿东西出来,再拼凑起来就完成了我的工作。有点像阿拉神灯,呵呵,很神奇不是吗?我也是这么认为,于是引出了我们的COM精华,可以提供一个简单的访问方式来完成各种各样的动作,而用户则根本不需要处理这些细节,用户只要根据说明(标签)来选择相应的功能,以达到自己的目的。我认为与其叫它组件,不如叫它零件更形象,呵呵,还有一个好处就是复用!
那么我们自己如何才能造出这样一个零件呢?别急我们一起,慢慢来,只要学过C++,我们很自然的就会用面向对象的思维去考虑问题,自然的把零件抽象成一个类来实现。可以吗?是的,但不是唯一的方法,这里我就不扩展了,有兴趣可以自己看,做为类来实现还有一个天然的好处,就是继承,我们的零件是具有通用性的零件,并且是可定制的,针对不同的应用场合,我们还可以对零件做无损的二次开发,对映到C++,原来的零件就变成了父类(基类),而新的二次开发后的零件变成了子类(继承类)这样,它不但继承了原来的所有东西,而且还可以添加新的功能。
还有一个概念要清楚,C++里的类可以直接操作和使用实例数据,但是COM组件是绝对不会直接访问任何实例数据的,而是通过函数来实现访问的,这样做的目的也是为了更大的灵活性。
所以从上面来看,我们首先要定义一个最基本的通用的零件模型,以便以后可以对它进行扩展,而这个最基本的模型,就是我今天要讲的IUNKNOWN接口。
这里所说的接口,就是上面讲的,可以提供访问的入口,其它所有的接口都是由它继承而来的,
(未完)
今天我还是要讲COM,从如何实现一个基本的COM框架入手,一点一点的感觉COM带给我们的便利,同时也感受着程序设计的艺术与魅力。
事先声明,以下观点实属本人自己的思想,不具有可靠的理论依据,我只是想用最简单的方法记住这样一种比较复杂的结构。所以会用一些可能不是很恰当的比方,但是我觉得适合我,呵呵。
还记得我刚开始拿到《VC6技术内幕》时,里面一开始就是一个飞船的例子,其中就有一个IUNKNOW的东西,我实在是被它搞得找不着北了,为什么要去学COM呢,就我而言,是因为要做DirectShow一些开发,没有办法,它全是基于COM的,虽然我会用它写程序,而且也能实现一些功能了,但是还是不明白,它那些看起来无所不能的函数QueryInterface(),到底做了些什么?我只是知道,我先用CreateInstance创建一个实例,然后再用它的QueryInterface()得到我想要的一些看起来像是对象的指针,然后再用这些指针->再调用一些函数来完成一些功能,我所知道的就这么多,但是就是这么点东西,我却做出了一个可以运行的程序,而且可以把摄像头捕捉到的画面显示出来了,这在我看来是有点不可想像,整个DirectShow对我来说就像是一个黑箱子,我只是按照它给我留的一个个口,每个口都贴了标签以说明它里面的东西是干什么的,于是我伸手进去拿东西出来,再拼凑起来就完成了我的工作。有点像阿拉神灯,呵呵,很神奇不是吗?我也是这么认为,于是引出了我们的COM精华,可以提供一个简单的访问方式来完成各种各样的动作,而用户则根本不需要处理这些细节,用户只要根据说明(标签)来选择相应的功能,以达到自己的目的。我认为与其叫它组件,不如叫它零件更形象,呵呵,还有一个好处就是复用!
那么我们自己如何才能造出这样一个零件呢?别急我们一起,慢慢来,只要学过C++,我们很自然的就会用面向对象的思维去考虑问题,自然的把零件抽象成一个类来实现。可以吗?是的,但不是唯一的方法,这里我就不扩展了,有兴趣可以自己看,做为类来实现还有一个天然的好处,就是继承,我们的零件是具有通用性的零件,并且是可定制的,针对不同的应用场合,我们还可以对零件做无损的二次开发,对映到C++,原来的零件就变成了父类(基类),而新的二次开发后的零件变成了子类(继承类)这样,它不但继承了原来的所有东西,而且还可以添加新的功能。
还有一个概念要清楚,C++里的类可以直接操作和使用实例数据,但是COM组件是绝对不会直接访问任何实例数据的,而是通过函数来实现访问的,这样做的目的也是为了更大的灵活性。
所以从上面来看,我们首先要定义一个最基本的通用的零件模型,以便以后可以对它进行扩展,而这个最基本的模型,就是我今天要讲的IUNKNOWN接口。
这里所说的接口,就是上面讲的,可以提供访问的入口,其它所有的接口都是由它继承而来的,
(未完)