什么是组件对象模型(COM)?它是语言依赖的吗?

时间:2009-10-29 18:57:58

标签: .net com

我是COM的新手,我不知道它是什么或为什么存在。

这是一种类似OOP的编程方法吗?编程语言是否必须支持它? (带一些特殊的关键词或其他东西)

当我向我的教授询问时,他说:

  

COM是一种二进制稳定的OOP方法。我们需要知道二元布局(某事......某事......)

我不知道这意味着什么。有人说它用于代码重用。 OOP在这方面做得很好,那么为什么这个COM首先会发展呢?

C ++和COM有什么用?无论我在哪里看到COM,它总是用抽象的C ++示例来描述。它只适用于C ++吗?

任何人都可以向我展示一个案例或例子,以便我能理解对COM的需求吗?学习这个有什么要求,所以我可以编写自己的组件?

4 个答案:

答案 0 :(得分:7)

COM的核心是提供独立于任何特定语言的数据传递合同的方式。它可以证明不依赖于语言,因为有许多语言支持COM(有C ++,C,.NET和Java实现)

在实践中,它对几个不同的例子很有用:

  1. 不同语言之间的通信:由于COM与语言无关,因此可以使用COM在不同语言的组件之间传递数据。例如,您可以使用COM在C ++,Java和.NET代码之间进行交流。
  2. 线程语义:COM允许您为特定组件定义线程语义,以确保它在适当的线程上下文中创建,无论它在何处使用。
  3. 一般组件化。

答案 1 :(得分:6)

首先创建COM作为允许Microsoft Office应用程序相互通信的机制,然后,在第二次迭代中,它被修改并扩展为二进制代码组件如何构建的规范 - 如果它们是根据规范 - 相互通信,共享数据,无论它们是基于什么语言或操作系统构建的(只要二进制文件(编译的.dll或.exe)符合COM规范)。

目的是允许“二进制重用”,这意味着代码组件可以被多个客户端代码组件重用,原始代码组件一无所知,并且在组件最初编译时甚至不存在。引用COM的一位原始建筑师Don Box:

  

[...] COM的设计范例是组件合同表示为类型定义。这是从被替换的COM世界向前迈出的一步,其中合同只表示为简单的功能切入点。在这方面,COM是一个重大进步,因为它以相当一致的方式将代码和类型系统的动态加载结合在一起。 。

答案 2 :(得分:3)

经过一段时间的考虑,我想最好的方法是让你掌握这个想法:

COM是一种扩展Windows API并在系统中发布其他自定义库的方法,因此您可以以相同的方式发现和使用这些新API,而无需重新编译应用程序。

COM对象在系统中已注册(通过在Windows注册表中添加一些挂钩)。完成后,您的应用程序可以在运行时查询这些预期的库,并根据它们的可用性来决定如何继续进行(而不是在找不到静态链接库时崩溃)。

这种机制应该是与语言无关的,因此用任何语言编写的任何应用程序都应该能够调用这些接口并调用这些库的操作。但实际上,某些语言不支持某些COM类型,因此它们的COM能力有限。

在评论中回答你的问题:

要使用COM,无需安装任何东西。一切都已经存在,以WinAPI函数的形式存在,您可以在应用程序中调用它们。 DllGetClassObject和CoGetClassObject用于实例化COM对象。 CoRegisterClassObject用于注册系统库中包含的COM对象。

为了实现与COM对象的统一创建和交互,它们的创建被委托给类工厂,这些是辅助对象。您调用CoGetClassObject并让它让您与所需对象的类工厂对话。给定该类库的接口,您要求它实例化您需要的对象。然后,您可以通过它公开的接口来操作对象。

查看维基百科上的这个简要概述:Component Object Model

答案 3 :(得分:1)

Component Object Model是Microsoft定义的标准,用于独立于语言的二进制对象接口,即它允许不同的OO语言传递对象并在其上调用方法。