最开始接触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的架构思想。欢饮拍砖,共同学习进步。