com的本质是什么,和动态库有什么关系
COMComponent Object Model组件对象模型的本质可以概括为一种二进制层面的软件组件交互标准它定义了不同软件模块之间如何通信、如何创建对象、如何管理生命周期而不依赖于具体的编程语言、编译器或源代码。1. COM 的本质二进制标准Binary Standard这是COM最核心的本质。它规定了内存布局如虚函数表/vtable的结构、调用约定stdcall和接口定义。只要遵循这个二进制标准用C、C#、VB、Delphi甚至汇编语言编写的程序都可以互相调用对方的组件。它解决了C不同编译器之间二进制不兼容的问题。接口契约Interface ContractCOM强制通过“接口”进行通信而不是直接访问对象内部数据。所有COM对象都必须实现一个基础接口IUnknown它提供了三个核心功能QueryInterface动态查询对象支持的其他接口实现多态。AddRef/Release基于引用计数的内存生命周期管理谁使用谁负责计数归零时自动销毁。位置透明性调用者不需要知道组件是在同一个进程内In-Process、另一个进程中Out-of-Process还是在另一台机器上DCOM。COM库OLE32.dll等会处理底层的进程间通信IPC或网络通信细节。注册与查找机制COM组件通常需要在Windows注册表中注册其唯一标识符CLSID和物理路径。客户端通过CLSID向系统请求创建对象系统根据注册表信息找到并加载对应的代码。2. COM 与 动态库DLL的关系COM 和 动态链接库DLL是**“规范/模型”与“载体/实现”**的关系。DLL 是 COM 组件最常见的物理载体虽然COM是一种逻辑规范但在Windows上绝大多数COM组件是以.dll文件的形式存在的这种被称为进程内服务器In-Process Server。当一个程序请求创建一个COM对象时如果该对象对应的组件是一个DLLCOM运行库会将这个DLL加载到调用者的进程空间中。此时函数调用是直接的内存调用效率最高。DLL中必须导出几个特定的C语言函数如DllGetClassObject、DllRegisterServer以便COM运行库能够初始化和管理其中的对象。COM 不仅仅是 DLLCOM 组件也可以是.exe文件称为进程外服务器或本地服务器。这种情况下组件运行在独立的进程中客户端通过代理Proxy和存根Stub机制与其通信。这提供了更好的隔离性和稳定性组件崩溃不会导致客户端崩溃。因此所有的进程内COM组件都是DLL但并非所有的DLL都是COM组件。普通的DLL只是函数的集合没有标准的对象创建接口如IUnknown和注册机制而COM DLL则严格遵循COM规范暴露对象而非仅仅是函数。总结对比特性动态库 (DLL)COM 组件定义包含代码和数据的可执行文件格式用于共享代码。一种二进制对象模型标准定义对象如何交互。依赖语言通常依赖特定编译器的命名修饰Name Mangling跨语言困难需extern C。语言无关任何能理解二进制接口布局的语言均可使用。内存管理由调用者或库内部自行管理无统一标准。强制使用引用计数AddRef/Release自动管理生命周期。物理形态只能是.dll文件。可以是.dll(进程内) 或.exe(进程外)。关系容器。内容规范。COM组件常以DLL形式存在。简而言之COM 是一套严格的“交通规则”和“车辆制造标准”而 DLL 则是符合这套标准最常见的“车型”。通过这套规则不同厂商开发者制造的车辆组件可以在同一条道路操作系统上无缝协作。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2443357.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!