COM专题之一----开篇COM(组件对象模型)

来源:互联网 发布:科学管理案例 知乎 编辑:程序博客网 时间:2024/05/01 12:34

Prerequisite:C++ 编程者,熟悉windows编程,熟悉Win32 Dll,了解windows注册表。

作者:收割者

COM是Component Object Model的简写,译为组件对象模型。组件对象模型可以说是windows开发当中,最基本的,应该掌握的一种技术。但是同时又是那么难以理解和学习的一种技术。也许学习COM的人最常听见的就是对COM的各种理论描述性的东西,网上这方面的资料也有,但是有价值的不多,也不全面,多为理论,而且知识点分散,不容易形成一个体系。COM集各种windows编程方式于一体,涉及到的技术也多,就像我的文章的开头说的那样,那些是基本的要掌握的。

本篇文章不具体涉及到COM的开发细节,在以后的系列篇中,将用实际的代码配合一定的理论知识,进行讲解。从接口定义,MIDL编译,注册接口或类型库,实现接口,实现类工厂,注册COM DLL,最后在测试程序中测试,这样一个完整的开发COM的完整过程按照开发顺序用博客写出来。另外,需要注意的是,目前我只说明IN_PROCESS COM。对于OUT_PROCESS COM暂时不涉及。如果你对COM一点都不了解,建议先到MSDN中对应的文章,学习COM的理论。也就说,你要有一定的理论基础在阅读我的COM的博客文章的时候。

为什么要学习COM?

COM是功能重用的一种方式,我们知道使用普通Win32 DLL,将功能编写在DLL中,然后从DLL中输出函数,就可以对功能进行重用,而扩展 MFC DLL通过将MFC类进行二次开发之后,放到DLL中,进行功能重用,规则 MFC DLL也可以重用功能。COM也是功能重用的一种方式,但是并不是通过输出函数来使用,而是通过注册对象的GUID到注册表中,然后使用COM Library的函数询问注册表,找到指定GUID对应的组件,然后创建那个对象,并通过你传递的接口ID(也是一个GUID),就可以获取接口指针,然后使用这个接口指针来操作对象。

COM 服务器(DLL)不用在乎它在系统中的存放位置。普通的DLL你必须知道它的完整路径,找到并加载它。COM 服务器在系统注册表中注册了它在位置。与这个位置对应的是它的GUID(全局唯一标示符)。只要知道它的GUID,需要它的时候,就可以找到它。

COM可以跨平台,语言无关,你开发的COM可以在vb,vc,net等等都可以使用,据说还可以跨系统,也就说在mac os中也可以使用,但是主要还是用在windows中。

COM可以跨线程,跨进程,跨计算机进行使用。

COM接口定义,注册一次,可以多次使用,完全不用管它过去的实现。

COM是windows开发中的基础技术,目前很多windows开发都在向COM靠拢,传统如DDE,剪切板等,都被COM的实现方式代替,如DDE被DDEML代替,剪切板被OLE Data Transfer代替。很多高级的windows技术,如ATL,ActiveX,Automation,OLE等都是通过COM技术实现,新的开发技术,如Windows Animation Manager,IFileDialog也都是使用COM技术,D2D,D3D,WIC,DirectShow,MediaFoundation等等,高级的windows开发,都用到COM技术,因此,学习COM是一个必修课。

学习COM的难点

COM涉及到的技术很多,它是一个体系,我们需要把很多的理论知识综合起来,在我们的大脑里面形成一个清晰的框架,这样,不管是对于我们开发自己的COM DLL,还是说去学习利用COM技术的开发主题,都是很大的帮助的。例如,Windows Animation Manager,如果你不知道COM的方式,那么你很难去学习它,掌握它,并利用它。

有关COM的技术资料呢,有价值的很少。我记得正是出版讲述COM的数是一个本叫《COM技术内幕》的书,这本书由一个外国人编写,经国人翻译过来的。我简单的看了一下,不是这本书写的不好,而是不适合初学者。起码我觉得我是个初学者,我靠它学不懂。我在学习COM的时候,花了很多的时间阅读MSDN文章,反复的阅读思考,然后在脑子里面逐渐清晰了起来。但是理论终归是理论,太过抽象,需要一个贴近实际的例子来给我说明,我在网上找了找,没有这样的文章,最后我在CodeProject上看到一篇博客,一位外国友人的博客,全是英文,上面我看到了我大部分我想要的东西,他也完整的讲解了COM的编写过程,对我的帮助很大,除此之外,我没有找到像那篇博客详细,专业的讲述COM,最后,我在msdn中又下在了一个例子,进行琢磨,将理论和实际结合起来。最后自己实践,验证了这个过程,并解决了很多疑问。

对自己有信心

尽管COM看上去很棘手,但是所谓,难者不会,会者不难,只要你要肯花时间,花精力,有毅力,就可以掌握它,建议COM的学习者反复的阅读MSDN上讲解COM的文章。没有什么文章比它更加准确,全面,权威。即使你一开始有很多疑问,遇到很多问题,也不要紧,问题最后都可以解决。
下一篇博客我将从接口的定义开始,因为这是编写COM的第一步,当然,如果你使用预定义的COM接口,也就是Windows系统定义的COM接口开发COM DLL,就可以不用自己定义接口,直接使用预定义的COM接口。
本文来自我的CSDN博客,除了磐实网站之外,别的网站如果出现我的文章,都是非法盗用。

本文推荐阅读地址:http://www.panshy.com/article/Sort_Desktop/other/2014-04-10/2483.php

0 0