我努力搜索,但无法掌握整个想法。谁能告诉我:
- COM实际上是什么?
- GUID 如何工作,COM 如何使用它们?
- COM如何解决不同DLL版本的问题。
或者至少,给我指出一篇解释这些概念的好文章?谢谢!
COM 是“组件对象模型”。它是最早设计用于允许“二进制重用”组件的技术之一……最初,它是对 Microsoft Office 大约 1988-1992 年的时间框架(称为动态数据交换 (DDE))的重写,旨在让各种 Office 应用程序相互通信的技术。重写它的第一次尝试称为 OLE-Automation(对象链接和嵌入)。但是当他们完成后,他们将其重命名为 COM。
这个怎么运作:
本质上,在 COM 之前,当客户端组件想要使用一个组件(编写为 C++ 库)时,它必须与库一起编译,因此它可以准确地知道编译后的二进制文件中有多少字节才能找到每个方法或函数称呼。
对于 COM,有一个关于如何构建这些方法的定义机制,然后编译器生成一个单独的文件(称为类型库或接口定义语言 (IDL) 文件,其中包含所有这些函数偏移数据。
然后,作为组件的用户,您必须“注册”它,它将所有这些信息(从 GUID 中键控)写入操作系统注册表,任何客户端应用程序都可以访问它,并通过从注册表中读取数据,它可以知道在二进制文件中的何处找到每个方法或类的入口点。
您的问题有点大,无法在此处进行完整解释。可以在《了解 ActiveX 和 OL E》一书中找到对 COM 的快速高级介绍。更详细但仍然是介绍性的介绍是Inside COM。关于这个主题的最好的书是 Don Box 的Essential COM。
几个快速的答案:
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)。
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 对象还有很多东西,我几乎没有触及表面。
10,000 英尺视野:
COM 是软件组件的通信机制。例如,您可以与 COM 接口(.NET 中的 COM 互操作)进行交互,以使用未通过公共接口(.NET 程序集)公开的功能。
GUID 在 Wikipedia http://en.wikipedia.org/wiki/Globally_Unique_Identifier上的解释相当不错
我一直将 LIB 文件理解为 C++ 链接器的目标文件。它们包含 cpp 文件中所有对象的代码。编译器在链接不需要的目标文件部分时进行优化。
有人请澄清,因为我确信我屠杀了其中的一些。
COM是 Microsoft 的组件对象模型,它是一种二进制兼容接口,用于以各种语言编写的程序相互操作。这是 OLE 和 .NET 技术之间的“进化步骤”。
如果您想从 C++ 的角度了解 COM,请查看 Don Box 的Essential COM或Rector 和 Sells 的ATL Internals。
microsoft.public.vc.atl组可能是提出您无法在此处获得答案的问题的最佳场所。它主要是一个 ATL 新闻组,但它似乎也是一般 COM 问题流量最多的新闻组。(只是为通常的新闻组生硬和不耐烦做好准备)
COM 是一种开发软件组件的方法,即小型二进制 exe,它为应用程序、操作系统和其他组件提供服务。开发自定义 COM 组件就像开发面向对象的 API。GUID 是一个全局唯一 ID,用于唯一标识一个 COM 组件。
您可以参考 Dale Rogerson 的一本非常好的书以了解更多详细信息。内部 COM