传统DLL和COM DLL之间的区别

smw*_*dia 28 c++ com

我正在学习COM.我发现COM DLL是基于传统的DLL基础结构构建的.当我们构建COM DLL时,我们仍然依赖传统的DLL导出方法来引导我们进入内部COM共同类.

如果COM用于二进制级别的组件重用,我认为传统的DLL可以实现相同的功能.它们都暴露了函数,它们都是二进制的,那么转向COM方法有什么意义呢?

目前,我感觉传统的DLL以" 平面 "方式公开方法,而COM DLL以" OOP "层次方式公开方法.OOP方式似乎是一种更好的方法.这可能是COM占主导地位的原因吗?

非常感谢.

Han*_*ant 34

不,有很大的不同.COM有一个定义良好的协议,用于创建对象,公开方法,管理内存,发布类型信息,管理线程.几乎没有任何语言不支持使用COM服务器,无论它是用什么语言编写的.

你不会直接暴露自己的功能.这可能仅适用于用C/C++编写的程序(因此它可以读取您的头文件),使用完全相同版本的C++编译器编译,并且不会出现各种互操作问题.像暴露像std :: string这样的C++类对象这样简单的东西是不安全的.内存布局既不保证兼容,也没有任何类型的内存所有权协议.

它可能更多OOPy,COM不支持继承,因为OOP很难在二进制级别兼容.这个问题需要所有代码购买的运行时支持,如.NET和Java等虚拟机.

  • 关于第二段,有相当多的语言/框架等允许您使用 C++ 之外的本机(非 COM)DLL。例如,.NET 通过 [P/Invoke](http://msdn.microsoft.com/en-us/magazine/cc164123.aspx) 有一个简单易用的互操作机制。 (2认同)
  • 有天壤之别。P/Invoke 是一次一次调用的战斗。COM 服务器 95% 开箱即用,无需任何努力。 (2认同)

Dav*_*ter 15

COM DLL只是一个具有Com特定入口点的DLL.COM公开用于创建com对象的类工厂,因此需要有一种方法来访问由COM服务器实现的类工厂之一.这就是DllGetClassObject的作用.此外,COM DLL是自注册的:它们可以通知Windows其可用的类和接口.拥有DLL寄存器本身的入口点是DllRegisterServer.

还有其他几个入口点,但它们都是这样的.

如果DllRegisterServer没有明确定义的入口点,则客户端将无法使DLL自行注册.这将使COM组件的安装更加复杂.

如果没有用于获取类工厂的标准化入口点,那么每个DLL都必须定义自己的入口点,并且必须将该信息放入Windows注册表中,以便COM基础结构知道如何访问每个DLL的类.厂.对于额外的复杂性没有任何理由,因此入口点也是标准化的.

至于COM与"C"的区别,主要区别在于合同的概念.COM鼓励程序员根据模块之间的抽象接口进行思考,而不是分层,自上而下的功能分解.这是一种'OOP',但这个术语太宽松而无法使用,IMO.面向合同的方法的优点对于强类型的静态链接语言(如C/C++)是多方面的.


Bai*_*ang 8

我想通过阅读Essential COM的第一章,您将非常了解使用COM的原因.

简单来说,COM确保二进制级别的兼容性,无论您使用何种语言,使用的是哪种版本的编译器.它不是关于"OOP"的东西,你肯定可以从DLL中暴露C++类,但它们不是"二进制兼容的".


Nem*_*vic 5

如果您想了解介绍COM的原因及其背后的理念,我强烈建议您阅读从CPP到COM


rob*_*ker 5

关键的区别在于COM支持二进制兼容性.

如果添加/删除功能并重建传统DLL,则任何客户端应用程序在尝试使用DLL时可能会失败,因为它们是针对早期版本构建的.

COM引入了接口的概念,它是不可变的,因此不应在构建之间进行更改等.每个COM对象必须实现IUnknown接口,该接口包含QueryInterface方法,该方法用于向对象请求指向其他受支持接口的指针.

COM规范确保IUnknown接口始终位于DLL中的相同位置,因此即使修改了对象以支持更多接口,仍然可以安全地调用QueryInterface方法.


Pav*_*sky 5

DLL在Windows中有很多用途.许多类型的库代码都存储在DLL中.例如,其中一个是.net程序集,它是一个不同的野兽.

COM DLL并不比"普通二进制PE DLL"好,因为COM DLL 也是一个普通的DLL.使DLL成为COM DLL的原因是,除了其他东西之外,某些导出符合特定合同(签名)[查找条目IUnknown],甚至几种类型的canonized接口[查找条目'双接口']仅实例化DLL内的特定对象,但也自动发现服务,包括函数名称和参数类型.

双接口使得链接到脚本语言(用于Web,shell脚本,教育程序等)非常方便,因为脚本程序员不关心严格的类型.COM DLL公开的双接口允许脚本运行时准确地查询它所期望的类型,并且无缝地向用户执行适当的转换.

这种灵活性允许构建整个巨大的COM基础设施,包括组件注册,DCOM(通过网络调用)等.这使得将COM接口提供到Windows组件(例如WMI)和办公组件中相当方便.在COM之上实现了许多其他流行的接口,例如ADO.

这一切都很好,但COM在任何意义上都不会"占上风".COM DLL是DLL的少数.普通的DLL和.NET DLL非常受欢迎.Microsoft认为.net接口优于COM.许多unix怪物和其他人认为DLL完全是一个坏主意,因为它不提供与unix共享对象一直有的相同意义上的运行时链接服务.尽管是一个Windows开发人员,我也认为SO提供了一个更好的选择,我希望有一次.