误入歧途的COM之旅:为什么我说是误入歧途

Posted CodeBowl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了误入歧途的COM之旅:为什么我说是误入歧途相关的知识,希望对你有一定的参考价值。

前言

首先此com非彼com(www.com),而是Windows的com机制!

最近在项目中遇到了com相关的问题,说起来就离谱,我们要实现一个动态链接库提供服务,但是调用方是用com机制去调用的,并且要求这个调用方exe不能修改,也就是我要实现适应com接口去实现一个dll。
但是更离谱的是,这个动态库应该是跨平台的,同时支持com和跨平台,咨询了好多大佬,最终没有什么好的方案,我也只能按照我最初的设想开搞!
也就是我要提供一套接口,后面是com的一套代码,还有linux的一套代码。

为什么将误入歧途呢?

这里有俩点:

  1. 第一个自然是我误入歧途了,进了com这个大坑,并且学会了以后再用到,可能就是下辈子的技术了
  2. 另外一个,我认为就是微软误入歧途了,花费了大量人力物力,本想一统天下的com,却因为超前于时代,如今已经鸡肋了。

说到这里,我觉得介绍以下com的历史还是相当有必要的,毕竟这也差亿点改变的编程界的天下。
艹蛋的是,你从网上甚至不能获得太多的资源,因为这毕竟是上个世界93年的想法。
还是一个在15年就被讨论是不是已经死掉的技术,想想现在已经是21年了,这个问题的答案,逐步明显了。

COM历史

COM(Component Object Model,组件对象模型)是微软公司于1993年提出的一种组件技术,它是一种平台无关、语言中立、位置透明、支持网络的中间件技术。 [1]
组件对象模型,一种面向对象的编程模式。它定义了对象在单个应用程序内部或多个应用程序之间的行为方式。它是微软对于网页服务器与客户端、增益集与Office系列软件之间交互的一项软件组件技术。

com简介

所谓COM(Componet Object Model,组件对象模型),是一种说明如何建立可动态互变组件的规范,此规范提供了为保证能够互操作,客户和组件应遵循的一些二进制和网络标准。通过这种标准将可以在任意两个组件之间进行通信而不用考虑其所处的操作环境是否相同、使用的开发语言是否一致以及是否运行于同一台计算机。

特点简单来说就是:
简单说COM就是一个通用的ABI规范,只要遵从这个规范,不管用什么语言写的程序都可以互相调用。

  • 跨平台

  • 跨语言

  • 跨机器

  • 跨进程

com设计的出发点

出发点就是一统江湖

COM要解决的问题大致有这些:
1,跨语言的互操作:C++、VB、JS等语言之间互相调
2,组件服务的可见性:需要一个仓库(注册表)登记提供服务的组件让使用者可以找到
3,组件的线程安全:需不需要考虑线程安全?在调用者线程执行还是在组件的工作线程执行?谁加锁?COM提供了三种选择。
4,调用的权限控制:调用者有没有权限使用组件提供的服务?
5,跨进程:RPC
6,跨机器(DCOM)
7,事务性支持(COM+)
无论用什么编程语言,要实现这些设计目标,都不会很简单。一个类似的例子是android的Binder框架。
它要解决的问题跟COM很相似:
1,跨语言:C++、JAVA
2,服务的可见性:组件需要注册到Service Manager
3,线程的安全性:组件自己解决,框架不管
4,调用的权限控制:checkPermission。。。
5,跨进程:Binder Driver

看见这么多目标,我就是惊了,其他机制实现一个跨平台就能拿出来吹吹了,所以这就有点步子迈大了!
特别是二进制兼容相当难!

com的坑

  1. com其实就是利用c++的虚函数动态绑定技术,这种技术作为接口是有缺陷的,详情看c++虚函数细节。
  2. com使用起来比较麻烦,学习成本比较高
  3. 精通了你也不会太大的用武之地,就好像21世纪,你是世界上最好的BB机维修员。

说说com的优点

这套思想还是很牛逼的,我也正在了解中

最后放一点com的争论贴

知乎上一搜,最多的就是,com过时了吗

为什么用C或C++表达Windows COM技术那么复杂呢?是C或C++缺少什么吗~

com组件技术已经过时了吗?

COM 过时了吗?它的应用前景究竟如何?
时至今日,COM组件是否还有其时代意义,是否还有深入学习的必要?

总结

小白贴,纯吐槽,之后慢慢学习。

低情商:
现在学这个,纯纯49年进国军。
高情商:
新时代没有载我的船!

以上是关于误入歧途的COM之旅:为什么我说是误入歧途的主要内容,如果未能解决你的问题,请参考以下文章

《异星歧途》,特别有意思的一个故事

弄懂UML本质,才不会误入歧途

2017年初随想——几个小目标

年幼无知太幼稚,差点误入直销窝

科技|如何防止机器学习“误入歧途”?

WEB接口测试之Jmeter接口测试自动化 第二弹(误入歧途)