COM 组件

最开始接触com组件的时候,我想知道的第一个问题,就是com组件到底是个什么东西,看好好长时间的com技术内幕,才算有点了解。

就像玩积木游戏一样,我有好多的积木小模块,然后通过这些积木组合成各种各样的积木模型,只要哥哥积木间的凸凹槽能对接起来。

与上面类似,com组件就是一个程序中(exe)中的各个分开的功能模块,通过他们的组合能够组成各种各样的具有某些功能的程序;

例如,我有个comA:能实现加法运算(+),且只是别加法

                        comB:能做减法运算(_),且只识别减法;

                       comC:能做乘法运算(*),且只是别乘法;

                       comD:能做除法运算(/),且只识别除法;


加入某个客户A想要你做一个可执行程序,只需要加减运算的,你只需要把程序积木comA和comB拼接在一起就能满足要求了;

A{comA,comB};

假如某个客户B想要你做个可执行程序,想实现,加法和除法运算;你只需要把程序积木comA和comD拼接在一起就能满足要求了;

B{comA,comC};


通过上面的说明,想必大家能够感受到com组件的用处了吧。就是,我们做工程开发的时候,只开发出具有一定通过功能的模块,通过模块的组合可以产生各种各样的应用。

这样的话,能大大的提高工作效率。当然这只是上面的一个好处,就像积木一样,只要积木间的凸凹插槽不变,积木的形状可以任意改变,这就为com组件的更新提供方便。

就像一个人旅游一样,刚开始的时候,对于固定的旅游地点,a,b,c,d.e,f制定了一个旅游线路图,以为最省钱而且玩的最好。如果对于这几个旅游地点玩的很熟的话,那么自己

后面有可能法线一条更好的旅游路线图,到时候都想安装新的线路进行走,而这些更改,有可能只是改变abc,这三个点之间的一段线路,其他的不用更改。这样的情况下,

只需要把原来线路的abc的一段替换就行了,原来的不变,这样的话最好,工作量小.程序也一样,程序实现的时候各个功能模块,某一个模块现在有了更好的算法来实现,只需要更该这个模块,如果使用com组件的话,只需要更新其中的一块就行,如果不适用com组件的话,所有的程序都需要全部编译一下。说的有点乱拉,继续;


提到com组件就得了解一个重要的概念,就是什么是com组件的接口。

由于com组件式与语言无关的,所以什么样的东西才能成为通用的接口呢;

如上例所示;

假如   comA:c++写的

          comB:c#写的

         comC:java写的

         comD:js写的

那么他们之间现在需要协作完成,先加后乘的运算,不同的语言,语法不同,怎么能够相互识别呢;

com组件的接口,是从内存块上进行定义的,她是具有一定结构的内存块,才看做是一个接口。也就是说,你可以通过不同的语言,去定义一种类型,只要你定义的类型,翻译成二进制内存模块的时候,内存格式满足一定的要求,满足这种要求的内存结构就是com组件的接口,估计你可能会问什么样的内存结构才能成为com组件的接口,具体什么样子的.这样的话,c++的纯虚类,具有这样的结构,当然还需要继承iunknown这点可以看com结束内幕,里面有图。


com组件为了实现更新而不影响客户的正常使用,是使用dll来完成对接口的封装。com组件是怎么实现更新组件,而不影响客户的正常使用呢。

例如comA它的实现封装在  comA.dll,而这个文件时在d:/,会有这样的一种映射来实现,假如com的功能函数 add();

GUID1::******************      d:/comA.dll

GUIU2::******************      add;


如上所示,如果客户想要使用加法运算的话,他只需要通过GUID1和GUID2两个唯一标示符,而不用操心dll在什么地方,函数在什么地方,就可以正常的执行加法运算;


正常的程序执行流程如下

客户想只想加法运算,他只知道,加法运算在那个组件中(comA),和该组件的GUID,和只想加法运算的GUID2.

当客户给出第一个GUID1的话,电脑会到系统注册表中进行guid(GUID1)的查找,找到之后,查看该guid所对应的路径(d:/comA.dll),找到该dll,然后把这个dll,装载到客户程序的内存空间中,同一个进程中(一个exe,是一个进程,里面的资源各个线程能够共享)。然后再查找GUID2(进程内存中,GUID2所对应的函数指针地址),然后传回该函数的指针,就能正常的执行加法运算了。


说了那么多,估计就我自己能看懂,我主要思想是学习com组件的时候,需要关注的主要的概念,是什么是com的接口,为什么使用dll来实现组件(windows)和com组件怎么完成的封装,能使不同的程序员调用他人编写的com组件(他人语言与自己有可能不同),使用他人的接口函数。


当然了还有很多关于dll ,guid,com组件的注册表注册,进程中服务器,本地,远程,等的概念需要大家去了解,这里只是一些简单的说明,最好的是了解com的架构思想。欢饮拍砖,共同学习进步。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值