什么是COM?

Ani*_*oel 24 com guid

我努力搜索,却无法掌握整个想法.谁能告诉我:

  • COM实际上是什么?
  • GUID如何工作,以及COM如何使用它们?
  • COM如何解决不同DLL版本的问题.

或者至少,请指出一篇解释这些概念的好文章?谢谢!

Cha*_*ana 19

COM是"组件对象模型".它是第一批允许组件"二进制重用"的技术之一......最初,它是在1988-1992时间框架内被称为动态数据交换(DDE)的Microsoft Office的重写,旨在允许各种Office应用程序相互通信的技术.第一次重写它的尝试称为OLE-Automation(对象链接和嵌入).但是当他们完成后,他们将其重命名为COM.

这个怎么运作:

本质上,在COM之前,当一个客户端组件想要使用一个组件(编写为C++库)时,它必须使用库进行编译,因此它可以准确地知道编译后的二进制文件中有多少字节来查找每个方法或函数呼叫.

使用COM,有一个关于如何构造这些方法的定义机制,然后编译器生成一个单独的文件(称为类型库或接口定义语言(IDL)文件,其中包含所有此函数偏移数据.

然后,作为组件的用户,您必须"注册"它,将所有这些信息(键入GUID)写入OS注册表,任何客户端应用程序都可以访问它,并通过从注册表中读取数据,它可以知道在二进制文件中找到每个方法或类入口点的位置.

  • DDE - > OLE - > COM - > ActiveX - > COM + - > DNA.这样的事情. (4认同)

Ste*_*owe 13

你的问题有点大,这里有一个完整的解释.有关COM的快速高级介绍可以在了解ActiveX和OL E 这本书中找到.更详细但仍然是介绍性的介绍是Inside COM.关于这个主题的最好的书是Don Box的Essential COM.

几个快速回答:

  • COM是对象的二进制接口标准.它允许各种程序写入接口,而不必使用相同的编译器在同一个语言中编写.还有相关的服务.
  • GUID是COM用于标识接口的全局唯一编号.
  • COM无法解决不同的DLL版本问题.它只允许为每个GUID注册一个DLL.


Wal*_*chi 7

COM支持可重用软件.与构建块一样,您可以创建COM对象(或现在的.NET中的程序集),以便为更大的软件提供功能.我使用COM为Excel和MS BizTalk提供数据库集成.像MS BizTalk这样的软件使用COM/Assemblies来扩展标准流程的处理能力; 您可以将COM插入到消息工作流中,以执行比Microsoft实现的更多处理.COM还允许使用提供内置对象池,安全性和控制接口的组件服务.

维基百科对GUID有一个很好的定义.请注意,Microsoft的格式在开发社区的其他部分中不必使用.

COM本身不解决DLL版本问题.如果使用COM版本控制功能,它可以使您逐步扩展软件.因此,如果您有一个使用COM将XML转换为Text(例如)并且想要增强的应用程序,则可以创建一个新版本(2.0),您可以在更新源应用程序时使用新COM.这样你就可以(如果需要的话)有一个switch语句,如果系统限制需要,仍然可以使用旧的COM,或者使用新的(它们将是不同的DLL).


Mic*_*ael 5

COM 是很多不同的东西。我推荐 Don Box 的书《Essential COM》,这是一种很好的学习方法。

至少,COM 对象是公开单个接口 IUnknown 的对象。该接口有 3 个方法,AddRef、Release 和 QueryInterface。AddRef/Release 使对象能够进行引用计数,并在最后一个引用被释放时自动删除。QueryInterface 允许您询问对象以获取它支持的其他接口。

大多数 COM 对象都是可发现的。它们在注册表中的 HKEY_CLASSES_ROOT 下注册,并使用称为 CLSID(类 ID)的标识 GUID。如果您知道 GUID,这使您能够调用 CoCreateInstance 来创建已注册对象的实例。您还可以通过 COM API 查询注册表以获取支持 ProgId(程序 ID)的 CLSID,ProgId 是标识对象的字符串。

许多 COM 对象都具有指定对象支持的接口和方法的类型库,以及具有 Invoke 方法的 IDispatch,该方法允许您动态调用对象上的方法。这使得可以从不支持强类型的脚本语言中使用该对象。

有些对象支持在不同的进程、不同的线程或不同的机器上运行。COM 支持这些类型的对象的编组。如果可能,标准编组器可以使用对象的类型库来编组对对象的调用,但也可以提供自定义编组器。

COM 对象还有很多内容,我只是触及了皮毛。


小智 3

10,000 英尺视野:

COM是软件组件的通信机制。例如,您可以与 COM 接口(.NET 中的 COM 互操作)进行交互,以使用未通过公共接口(.NET 程序集)公开的功能。

GUID 在维基百科上的解释相当不错http://en.wikipedia.org/wiki/Globally_Unique_Identifier

我一直将 LIB 文件理解为 C++ 链接器的目标文件。它们包含 cpp 文件中所有对象的代码。编译器在链接时会优化,而忽略目标文件中不需要的部分。

有人请澄清一下,因为我确信我杀死了其中的一些。