我对COM的理解
来源:互联网 发布:软件职业教育学校 编辑:程序博客网 时间:2024/06/11 01:22
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所说,多动手编程,多使用它们,并考虑它们
是如何的工作起来的。
一些接口和接口函数,其他程序通过固定的方法使用这些函数,在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所说,多动手编程,多使用它们,并考虑它们
是如何的工作起来的。
- 我对COM的理解
- 我对COM的理解
- 谈谈我对COM、OSGI、插件的理解(一)
- 对COM组件的理解
- 我对SOA的理解我对SOA的理解
- 我对事件的理解
- 我对SOA的理解
- 我对SOA的理解
- 我对SOA的理解
- 我对ERP的理解
- 我对JSP的理解
- 我对字符集的理解
- 我对webservice的理解
- 我对SOA的理解
- 我对MMU的理解
- 我对黑客的理解
- 我对servlet的理解
- 我对CSS的理解
- 数据库的连接串
- ex
- MS.NET开发三层结构应用程序
- CSS学习笔记二
- 实施个人战略计划 1/7
- 我对COM的理解
- 用汇编写系统服务程序
- 美国大学启示录
- 用asp做很简单的讨论室(比聊天简单),如何分房间?主要是房间的名字如何定义?高手帮忙,谢谢啦!!
- Web页面无刷新获取远程数据
- 男人与酒
- 约束、规则、默认值和触发器
- Win32环境下Apache2和Tomcat5用JK2整合心得
- [转贴]富人和穷人12大经典差异