什么是COM?

时间:2009-04-14 16:24:03

标签: com guid

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

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

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

7 个答案:

答案 0 :(得分:15)

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

工作原理:

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

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

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

答案 1 :(得分:13)

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

快速回答几个问题:

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

答案 2 :(得分:6)

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)。

答案 3 :(得分:3)

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

COM对象是一个暴露单个接口IUnknown的对象。该接口有3个方法,AddRef,Release和QueryInterface。 AddRef / Release使对象可以被引用计数,并在释放最后一个引用时自动删除。 QueryInterface允许您查询它支持的其他接口的对象。

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

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

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

COM对象还有很多东西,我几乎没有表面。

答案 4 :(得分:1)

10,000英尺的视野:

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

在维基百科http://en.wikipedia.org/wiki/Globally_Unique_Identifier

上解释GUID相当不错

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

有人请澄清,因为我确信我已经诅咒了一些。

答案 5 :(得分:0)

COM是Microsoft的组件对象模型,它是一个二进制兼容的接口,用于以各种语言编写的程序,以便彼此互操作。它是OLE和.NET技术之间的“进化步骤”。

如果您想从C ++的角度了解COM,请查看Don Box的Essential COMATL Internals以及Rector和Sells。

小组microsoft.public.vc.atl可能是提出问题的最佳地点,您无法在此获得答案。它主要是一个ATL新闻组,但它似乎也是一般COM问题流量最多的新闻组。 (只是为通常的新闻组做好准备和不耐烦)

答案 6 :(得分:0)

COM是一种开发软件组件的方法,小型二进制exe,为应用程序,操作系统和其他组件提供服务。开发自定义COM组件就像开发面向对象的API一样。 GUID是全局唯一ID,用于唯一标识COM组件。

你可以参考Dale Rogerson的一本非常好的书来获取更多细节。 Inside COM