我需要为当前项目学习COM。我是一个菜鸟,我一直无法找到COM的良好起点。我一直在研究MSDN和谷歌搜索...我确实在codeproject.com上找到了一些有趣的文章,但我不满意。为什么要使用COM?为什么存在?它存在于什么地方?.....等等..那么,请您告诉我在哪里可以找到这些问题的答案?
我需要为当前项目学习COM。我是一个菜鸟,我一直无法找到COM的良好起点。我一直在研究MSDN和谷歌搜索...我确实在codeproject.com上找到了一些有趣的文章,但我不满意。为什么要使用COM?为什么存在?它存在于什么地方?.....等等..那么,请您告诉我在哪里可以找到这些问题的答案?
Answers:
学习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上,因此我们通常会忽略其他四个原则。)
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
高度
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类获得。
以下内容可能是有用的COM概述M:
第一个视频讨论了创建二进制组件以重用以不同语言(与语言无关)并且在不同机器(进程)(与位置无关/透明)中编写的代码的一般思想。该技术在某些软件公司中用于与其他软件(公司)集成,而不是购买其软件并将其嵌入自己的软件或从头开始在其系统中编写代码。
该技术具有三种不同的版本(实现):
面向C ++开发人员的OLE / COM / DCOM / ActiveX(使用ATL可简化程序员的工作)
适用于Java开发人员的JavaBeans / RMI / EJB
CORBA / IIOP
只需将其视为一种技术,当您用Java编写软件并想要向其添加功能时就可以使用该技术,该功能已经存在于软件包中,但是它是用C ++编写的,甚至可能位于不同的计算机中,而并非您的本地计算机。您如何称呼“新”,如何制造对象并从中调用方法?
我见过的以下进行COM编码的人的书架上有其中一本:
COM和ATL 3.0开发人员研讨会
内部通讯
基本COM