什么是COM?

什么是COM?,com,guid,Com,Guid,我努力地寻找,但无法领会全部意思。谁能告诉我: COM实际上是什么 guid是如何工作的,COM是如何使用它们的 COM如何解决不同DLL版本的问题 或者至少,给我指一篇解释这些概念的好文章? 谢谢 10000英尺视图: COM是软件组件的通信机制。例如,您可以与COM接口(.NET中的COM互操作)交互,以使用未通过公共接口(.NET程序集)公开的功能 guid在Wikipedia上的解释相当不错 我总是理解LIB文件是C++链接器的对象文件。它们包含cpp文件中所有对象的代码。编译器在链

我努力地寻找,但无法领会全部意思。谁能告诉我:

  • COM实际上是什么
  • guid是如何工作的,COM是如何使用它们的
  • COM如何解决不同DLL版本的问题
或者至少,给我指一篇解释这些概念的好文章? 谢谢

10000英尺视图:

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

guid在Wikipedia上的解释相当不错

<>我总是理解LIB文件是C++链接器的对象文件。它们包含cpp文件中所有对象的代码。编译器在链接时进行优化,而不考虑对象文件中不需要的部分


有人请澄清一下,因为我肯定我已经把其中的一些弄糟了。

你的问题有点大,这里需要一个完整的解释。可以在E书中找到COM的快速高级介绍。更详细但仍然是介绍性的介绍。这方面最好的书是唐·博克斯的

以下是几个简单的答案:

  • COM是对象的二进制接口标准。它允许各种程序写入接口,而无需使用同一编译器在同一语言中编写所有程序。还有相关的服务
  • GUID是COM用于标识接口的全局唯一编号
  • COM不能解决不同的DLL版本问题。它只允许为每个GUID注册一个DLL
    • 是微软的组件对象模型,是一个二进制兼容的接口,用于各种语言编写的程序之间的互操作。这是OLE和.NET技术之间的“进化步骤”

      如果您想从C++的视角了解COM,请查看Don Box,或者雷克托和Surviv.

      小组可能是问你在这里找不到答案的问题的最佳场所。它主要是一个ATL新闻组,但它似乎也是一般COM问题流量最多的新闻组。(只需为通常的新闻组简短和不耐烦做好准备)

      COM是“组件对象模型”。它是最早设计用于允许组件“二进制重用”的技术之一。。。最初,它是对微软Office大约在1988-1992年间被称为动态数据交换(DDE)的重写,DDE是一种允许各种Office应用程序相互通信的技术。重写它的第一次尝试被称为OLE自动化(对象链接和嵌入)。但当他们完成后,他们将其重命名为COM

      工作原理:

      本质上,在COM之前,当客户端组件想要使用一个组件(作为C++库编写)时,必须使用库编译,这样它就可以准确地知道编译的二进制文件中有多少字节来查找每个方法或函数调用。p> 对于COM,有一个定义的机制来确定这些方法的结构,然后编译器生成一个单独的文件(称为类型库或接口定义语言(IDL)文件),其中包含所有函数偏移量数据


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

      COM是一种开发软件组件的方法,即小型二进制exe,它为应用程序、OS和其他组件提供服务。开发自定义COM comnponent类似于开发面向对象的API。GUID是一个全局唯一ID,用于唯一标识COM组件


      你可以参考戴尔·罗杰森(Dale Rogerson)的一本好书了解更多细节。

      COM有很多不同的东西。我推荐唐·博克斯(Don Box)的书,Essential COM作为一种学习的好方法

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

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

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

      某些对象支持在不同进程、不同线程或不同机器上运行。COM支持对这些类型的对象进行封送处理。如果可能,标准封送处理程序可以使用对象的typelib封送对对象的调用,但也可以提供自定义封送处理程序


      COM对象还有很多东西,我只是说了点皮毛。

      COM支持可重用软件。像构建块一样,您可以创建COM对象(或者现在在.NET中创建程序集)为更大的软件提供功能。我使用COM为Excel和MS BizTalk提供DB集成。类似MS BizTalk的软件使用COM/程序集扩展标准流程的处理能力;您可以将COM插入到消息工作流中,以进行比Micros实现的更多的处理