梦中江湖

世间一切皆为江湖,世间一切皆不为江湖。曾经年少,觉得一切皆是那么美好,世间事物一切皆可为我所有,天下之大皆我可往。有一种江湖的情结,豪情满胸。可是时间的流逝,年龄的增长,心中的江湖已经不在,现在江湖泛滥,唯有小酌入梦后,才能在梦中再见我的江湖!再见我的青春!

  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  12 随笔 :: 0 文章 :: 15 评论 :: 0 Trackbacks
COM,组件对象模型,通俗说就是COM就是提供了一种编程的架构。通过COM规范规定了COM组件应该实现的一些接口和接口函数,其他程序通过固定的方法使用这些函数,在Windows平台下,所谓的固定方法通过提供的各种GUID在注册表中找到COM组件,然后调用指定的DLL或者EXE(通过ROT)调用指定的函数,以获得所需要的接口的指针,所谓的接口的指针其实就是指向函数指针数组的指针,通过接口指针调用COM组件提供的服务。
    如果不借助ATL等类库等实现COM组件,其实也很简单,只需要牢记下面几点就可以了:
    1、使用IDL在idl文件中定义接口。因为COM是与语言无关的,所以需要一种各种语言等能懂的语言来定义
    接口。使用MIDL编译编写好的idl文件可以获得一个.h文件,从此文件中就可以看出在idl文件中定义的
    接口被编译成了C++中的纯虚类。从这里也可以得到:
        A、纯虚类的内存结构确实是和COM所要求的内存结构相同,所以使用纯虚类来定义COM接口;
        B、其实可以不需要idl文件直接使用C++语言定义COM接口,那又为什么需要呢?简单言之,就是为了
        实现COM的语言无关性。使用C++定义的接口不能被其他语言所使用,当使用IDL语言编写的idl文件
        被MIDL编译之后可以生成一个.tlb的类型库文件,此文件可以被其他语言使用。
    2、接口的实现其实很简单,就是在继承了所定义的接口的派生类当中实现就可以了。一个派生类可以继承自多个接口。为了实现一些功能可以继承自一些标准的COM接口,比如:IDispatch、IMarshl等,但是一般都需要实现IClassFactory或者IClassFactory2接口。类厂接口的作用是提供一个通用的创建组件对象的
    方法。对于进程内组件在C++中我们可以使用new来创建新的对象,但是对于进程外或者是远程的组件,new 好像是无能为力了,所以提供类厂接口,由类厂和代理打交道来完成对象的创建。
    3、组件程序中实现相关的导出函数,以便被其他应用程序调用,比如注册函数、生命周期控制函数等等。
    4、最后要牢记如果要有不清楚的地方多看MSDN,熟记一些常用的标准接口,对于套间、列集等要特别注意。
    
    无论是在MFC中使用嵌套类来实现COM,还是ATL中使用的多重继承来实现COM,抑或是使用ODL语言来编写接口的定义,其最基本都是上面所说的,只不过MFC和ATL中多了一些宏来替代直接使用C++编写的各种类定义、函数定义等,这样使程序看起来简洁,但是对于认识COM的原理其实并没有好处,所以在使用这些宏的时候看看它们的定义会帮助你更深刻的认识COM。ODL语言只是IDL语言的扩充,其实没有什么特别的地方,只要多看看,弄懂了一些关键字的意思就可以了,比如:interface、dispinterface、coclass、import、library、importlib、defult等等。
    总之要想深刻的认识COM,熟练的使用COM编程,就要如Don所说,多动手编程,多使用它们,并考虑它们是如何的工作起来的。
posted on 2005-06-20 09:10 梦中江湖 阅读(589) 评论(0)  编辑 收藏 引用
只有注册用户登录后才能发表评论。