代码之家  ›  专栏  ›  技术社区  ›  Anirudh Goel

什么是COM?

  •  20
  • Anirudh Goel  · 技术社区  · 15 年前

    我努力寻找,但无法领会整个想法。有谁能告诉我:

    • 什么是COM?
    • COM如何解决不同DLL版本的问题。

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

    7 回复  |  直到 15 年前
        1
  •  19
  •   Thalia    10 年前

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

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

    在COM中,有一个定义的机制来确定这些方法的结构,然后编译器生成一个单独的文件(称为类型库或接口定义语言(IDL)文件),其中包含所有这些函数偏移数据。

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

        2
  •  13
  •   Steve Rowe    15 年前

    你的问题有点大,这里要作全面的解释。在书中可以找到对COM的快速高级介绍 Understanding ActiveX and OL E、 一个更详细但仍然是介绍性的介绍是 Inside COM . 这方面最好的书是唐·博克斯的 Essential COM .

    几个简单的答案:

    • COM是对象的二进制接口标准。它允许各种程序编写接口,而不必使用同一个编译器在同一语言中编写所有程序。也提供相关服务。
    • guid是COM用来标识接口的全局唯一数字。
    • COM无法解决不同的DLL版本问题。它只允许为每个GUID注册一个DLL。
        3
  •  7
  •   Amadeus Sanchez    8 年前

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

    维基百科对 GUID . 请注意,Microsoft的格式不必在其他开发社区中使用。

    COM本身无法解决DLL版本问题。如果您使用COM版本控制功能,它允许您以增量方式扩展软件。因此,如果您有一个使用COM将XML转换为文本的应用程序(例如),并且您想要增强它,那么您可以创建一个新版本(2.0),当您更新源应用程序以使用新COM时,它可以缓慢地推出。这样,您可以(如果需要)有一个switch语句,如果系统限制需要,它仍然可以使用旧的COM,或者使用新的COM(它们将是不同的dll)。

        4
  •  3
  •   Michael    15 年前

    COM是很多不同的东西。我推荐Don Box's book,Essential COM作为一种好的学习方式。

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

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

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

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

    还有很多关于COM对象的东西,我几乎没有触及表面。

        5
  •  1
  •   theG    15 年前

    10000英尺视野:

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

    guid在Wikipedia上解释得相当不错 http://en.wikipedia.org/wiki/Globally_Unique_Identifier

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

    有人请澄清一下,因为我肯定我杀了一些。

        6
  •  0
  •   Jason S    15 年前

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

    如果你想从C++的角度了解COM,请看DON Box Essential COM ,或 ATL Internals 由校长和销售。

    microsoft.public.vc.atl 可能是问你在这里找不到答案的问题的最好地方。它主要是一个ATL新闻组,但它似乎是最有流量的新闻组,为一般的COM问题以及。(只需为新闻组通常的简朴和不耐烦做好准备)

        7
  •  0
  •   aJ.    15 年前

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

    你可以参考戴尔·罗杰森的一本好书来了解更多细节。 Inside COM