学习组件对象模型的最佳场所


13

我需要为当前项目学习COM。我是一个菜鸟,我一直无法找到COM的良好起点。我一直在研究MSDN和谷歌搜索...我确实在codeproject.com上找到了一些有趣的文章,但我不满意。为什么要使用COM?为什么存在?它存在于什么地方?.....等等..那么,请您告诉我在哪里可以找到这些问题的答案?


3
我们为什么要使用COM?通常,我们尝试不这样做。它存在于什么地方?通常,痛苦的旧代码库。
Carson63000

@carson actully我正在开发一个监视软件,我需要在其中获取“ COM”对象的值。因此,新发现的任务..
Chani

1
如果我没记错的话,在COM上最好的3篇网络文章中,有2篇是关于MSDN(一些旧杂志的文章),有1篇是关于CodeProject的……显然,还有其他数百篇有用的文章,所以就像在大海捞针中找针。(并且感谢Google在我搜索“ COM”时仅返回“ .com” TLD中的网站...)
rwong 2011年

@ Carson63000真是太痛了...现在要在一个角落里哭泣。
Evicatos

Answers:


18
  • 首先,COM就像面向对象的编程一样。COM接口是一个抽象接口。
  • COM相对于每种语言自己的内置OOP都有一个优势,即您可以使COM类以不同的语言实现和/或由不同版本的编译器进行编译,并且它们仍然可以互操作。这称为“应用程序二进制接口”(ABI)
  • COM使用引用计数。起初可能很烦人,但是一旦您了解了智能指针,您的生活就会轻松很多,并且您会发现引用计数的概念非常容易理解。
  • COM使用一种奇怪的类转换方式,即“查询接口”。

学习IUnknown是第一步。

IStream接口是一个适合初学者学习的良好COM接口。您可以通过使用多种存储数据的方式实现IStream接口来练习COM。


添加的2012/09/28:

发明COM机制之后,微软公司的人们发现这些机制为非常规的OOP编程技巧打开了大门。在最低级别上,IUnknown.QueryInterface这只是一种方法。它可以做任何事情。这些技巧使COM吓倒了学习者,因为它们会使来自OOP的基本推理无效。

MSDN上的Microsoft文档花费大量时间说“ COM不是……”或“不做任何假设”,以解释这些不寻常的技巧如何破坏您的代码。

COM设计人员使用Liskov替换原理(SOLID中的“ L” )来确保其多个接口和技巧的使用不会使基本的OOP推理或程序操作无效。

如果您的项目没有使用这些技巧,那么仅从OOP的角度来看COM就是可以的。如果您的项目使用这些技巧,则需要将COM视为自修改代码。

(笑话:我们不得不花很多时间在L上,因此我们通常会忽略其他四个原则。)


9

COM的主要原因是在应用程序与可能驻留在不同内存空间中的其他应用程序和dll之间以及可能具有不同内部对象表示形式的对象之间提供面向对象的通信接口。

在学习COM时要记住的一点是,当时C ++是王者,而使用C调用dll的应用程序。没有通用的ABI(如@rwong所说),而COM是微软的解决方案。

值得一看的是Visual Studio的活动模板库(ATL),这也使使用COM更加容易。

我发现有两本书对当时有用

http://www.amazon.com/Essential-COM-Don-Box/dp/0201634465/ref=sr_1_1?ie=UTF8&qid=1304946825&sr=8-1

http://www.amazon.com/了解-ActiveX-OLE-Developers-Technology / dp / 1572312165 / ref = pd_sim_b_4

高度


7

我最初是从《学习DCOM》一书中学到COM的(DCOM只是COM的扩展,本书主要是关于COM的)。它已经使用了十多年,如果您使用它,它应该很便宜(因为COM不再很热,即使在Microsoft世界中也是如此,即使它仍然用于互操作)。

COM存在的主要原因是为了促进基于组件的开发,这基本上意味着,在编译代码时,不是链接库,而是引用一个接口(有关如何与外部组件进行通信的描述),并使用一些实现在部署时。它是Microsoft大部分自身技术的基础。

该系统支持一些在一切进行管理之前很酷的功能(例如引用计数和自我描述(通过IDispatch))。


5

COM是上世纪90年代创建的标准,允许不同的软件相互通信。最重要的是二进制标准,该标准允许一个软件创建或绑定到对象,然后调用该接口。这使您可以执行以下操作,例如在C ++中创建一个可由ASP页调用的DLL(COM对象),或在Delphi中创建一个控件,然后将该控件放到VB对话框(ActiveX控件)或Excel工作表中。当您将图片粘贴到Word中时,它也使用COM,将单独的应用程序嵌入到Word中。DCOM不太流行,它可以调用远程对象,通常有更简单的方法来执行此操作。

因此,Com / ActiveX / DCOM在10年前非常受VB,VBA,C ++ / ATL和Delphi的欢迎。Dotnet更加简单,而C#取代了COM和VB等的大多数用法

仍然有许多COM接口存在,您可能想从dotnet应用程序或Java或C ++调用。(你不说)

如果需要调用COM接口,则VB是执行此操作的最简单方法。在Dotnet 4.0中,C#具有dynamic关键字,这使调用IDispatch接口更加容易,这可能是您应该考虑的一个很好的解决方案。

如果您需要了解很多细节,那么您确实需要使用C ++和ATL,调用诸如CoCreateInstance之类的C API。如果您可以将其作为一种古老的技术并且使用不多,则应避免使用此方法,请坚持上述建议。

我不确定您要使用哪种监视软件,但可能可以通过dotnet中的System.Management类获得。


2

以下内容可能是有用的COM概述M:

第一个视频讨论了创建二进制组件以重用以不同语言(与语言无关)并且在不同机器(进程)(与位置无关/透明)中编写的代码的一般思想。该技术在某些软件公司中用于与其他软件(公司)集成,而不是购买其软件并将其嵌入自己的软件或从头开始在其系统中编写代码。

该技术具有三种不同的版本(实现):

面向C ++开发人员的OLE / COM / DCOM / ActiveX(使用ATL可简化程序员的工作)

适用于Java开发人员的JavaBeans / RMI / EJB

CORBA / IIOP

只需将其视为一种技术,当您用Java编写软件并想要向其添加功能时就可以使用该技术,该功能已经存在于软件包中,但是它是用C ++编写的,甚至可能位于不同的计算机中,而并非您的本地计算机。您如何称呼“新”,如何制造对象并从中调用方法?

我见过的以下进行COM编码的人的书架上有其中一本:

  • COM和ATL 3.0开发人员研讨会

  • 内部通讯

  • 基本COM

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.