COM、COM+、DCOM,从哪里开始?

32

我对COM+和DCOM很感兴趣。我知道微软不鼓励你使用这些工具(指用C/C++原生,事实上没有太多可用的文档),但我想学习使用这些技术,比如将Internet Explorer嵌入到C程序中。

我想也许我可以找到与此相关的人或者了解这项技术的人。

从哪里开始?有什么想法吗?有什么示例(如Hello World DCOM)吗?


4
顺便说一下,不要因为我们的回答建议学习的数量而感到灰心丧气。听起来你正在尝试编写一个COM客户端而不是一个COM组件。相比于COM组件,编写COM客户端要容易得多。你会非常开心的。 - Euro Micelli
7个回答

37
如果你想认真学习COM,Don Box的《Essential COM》绝对是必读之选。COM可能会让人感到困惑,而在我个人看来,Don Box是少数几个真正“懂它”的人之一。
《Essential COM》中的示例代码是用C++编写的。你不会在很多支持C语言的COM书籍中找到这样的内容。虽然你可以用C语言写COM,但这将非常痛苦。COM优化了C++开发。
这本书并不完美也不是“完整的”。有些(尽管有点深奥)地方被略过了。例如,书中只有1页半关于“monikers”(我从未见过一个满足我的monikers处理方法)。我认为这本书是基础书籍。
其次,在现实生活中,你很可能想要使用诸如ATL之类的支持库,而不是直接编写所有COM粘合剂。即使在基本设置中也有太多的方式可以出现微妙的错误。ATL将为您提供良好的模式,并为您实现无聊的代码。在学习过程中,最好使用普通的C++。
有许多关于ATL的书,其中一些相当不错。我了解到ATL自VC++6以来已经发生了很大变化,但我没有第一手的知识:遗憾的是,我处理的大部分COM代码都永远锁定在VC6的C++版本中。
确保你获取的书籍是针对你计划使用的Visual Studio和/或ATL版本编写的。
关于COM书籍的一些背景信息:
请注意,有很多书籍误解了COM,或者关注了错误的方面。在这方面,早期的书籍更糟糕。前几本书中有些将COM视为几乎只是使OLE工作所需的管道细节(“对象链接和嵌入”,这就是允许你将电子表格范围拖放到Word文档中的功能)。因此,很多相关材料非常令人困惑。过了一段时间人们才意识到OLE并不那么重要,而COM才真正重要。

当唐·博克斯出版了《Essential COM》时,COM的基础问题已经开始显现了。COM并没有太大的缺陷,但开发社区的需求已经演变并超出了COM的能力范围,需要进行严重的改进。

.NET就是为解决COM在“类型信息”等方面的局限性而诞生的。在《Effective COM》出版仅几年后,社区的关注点转向了.NET。因此,好的COM培训材料现在很少,并且可能会一直如此。

所以,COM并没有损坏,它在使用它用于的事物上工作得非常出色(这就是为什么Explorer仍在使用它)。但是,对于需要解决的许多问题,它不再是最佳解决方案。

总之:

我建议先学习《Essential COM》中的基础知识,然后阅读其他许多可用的好的ATL图书(没有强烈的偏好),然后使用其他资源,如MSDN或当然 - Stack Overflow,来覆盖您特别感兴趣的领域。

如果你更喜欢不依赖纸质资源,请继续从网络中学习ATL。但有些书值得老式阅读,例如《Essential COM》。

祝你好运。


10

COMCOM+DCOM 都是完全不同的东西。目前,学习COM的理由非常少,学习DCOM的理由几乎没有。我唯一能想到的理由是,如果你必须维护或集成旧组件。COM+仍然被使用,因为它允许在进程外托管组件,并具有分布式事务管理等好处。

编写一些COM的最佳方法是使用ATL。在.NET中,COM+称为Enterprise Services

我所知道的关于COM的最佳书籍是Don Box的Essential COM和Tim Ewald的COM+ book也很棒。


5
Windows 8的新WinRT核心基于COM。具有良好COM理解能力的商业程序员多年来一直供不应求,并且在未来的许多年里仍将继续供不应求。 - Neutrino

7
我编制了一份书单,应按以下顺序阅读:
  1. 《Inside COM》作者 Dale Rogerson。这应该是你的第一本书。它解释了引用计数、接口、IUnknown、组件、idl、IDispatch、自动化类型和公寓的基础知识。从这本书中,你会发现制作组件需要相当多的代码,并且很容易忽略“Release”,导致资源泄漏。此外,这本书缺少一些细节。
  2. 《ATL Internals》作者 Tavares。ATL可以帮助你使用客户端并制作COM组件。使用智能指针(例如CComPtr),现在很难出错。ATL还在宏中隐藏了许多功能,并且实现IUnknown的方式不直观。另一种选择可能是《Inside ATL》。
  3. 《Essential COM》作者 Don Box。这本书经常被提到,但不是一个好的入门书。它缺乏整体图像,但在细节方面非常出色(例如,在idl中“size_is”和“length_is”的区别)。
  4. 《Understanding ActiveX and OLE: A Guide for Developers and Managers》。这本书涉及一些比较深奥的接口,如IPersist、IStorage;IMoniker等,但没有进一步详细介绍。
请注意,COM有点像一项古老的技术,尽管对于本地开发人员仍然是可行的。

3

从“Inside COM”开始,然后转向“Inside DCOM”,最后阅读“Essential COM”。这样你就能掌握COM了。Inside COM和Inside DCOM这两本书都是微软出版的。对于想全面了解COM/DCOM的人来说,这是非常好的书籍。


3

如果您要处理或扩展各种Windows API(如shell扩展程序、脚本宿主等),仍然可以使用COM。

《Essential COM》(Box)和《ATL Internals》(Rector和Sells)是很好的资源。《Effective COM》(Box等人)也还可以。

如果您真的想全面了解COM,请尝试获取庞大的《Inside OLE》(Brockschmidt)副本。

在DCOM方面,《Distributed COM》(Eddon,Eddon)还可以,对于COM+,《Inside COM + Base Services》(Eddon,Eddon)也不错。

即使一些所谓的“纯”C++书籍中也有关于COM的部分。Matthew Wilson的《Imperfet C++》中有一些有用的内容,可以看到其内部运作方式,他的《Extended STL》书中还有几章关于如何将COM适配到STL集合中。

如果您想了解更多有关编写COM服务器的信息,可能需要加强对ATL的学习。前述的《ATL Internals》是必备的。尽管名称听起来很普通,《Beginning ATL COM》中也有一些有用的内容。

在学习过程中,将COM与.NET进行对比也可能会有所帮助。《.NET and COM Interoperability Handbook》是一个较长的读物,但其中有一些有用的内容。此外,我建议查看《Shared Source CLI Essentials》,以便对比这两种技术。

希望有所帮助。


1
你的第二个条目是指“Effective COM”,对吗?Essential COM(Box等)也可以。 - Euro Micelli
反过来,谢谢您的发现。 - DannyT
2
真的吗?“Effective COM”是Box、Brown、Ewald和Sells合著的,而“Essential COM”只有Box一人写作。两本书都非常棒。 - Euro Micelli

2

Essential COM是专门为在C++中实现或使用COM组件而设计的,而不需要使用IDE、框架或库进行帮助。

例如,在VB或Delphi中使用COM非常简单,这些语言会将COM特定的细节隐藏起来,不会让应用程序员感到繁琐。而在C++中,你通常会使用一些尝试抽象出这些细节的类库...Essential COM会告诉你这些细节是什么(并在此过程中实现了自己的库/框架)。


1

这是最先进的技术吗?它看起来有点老旧。 - noripcord
3
COM已经过时了。在过去的8年里,所有的Microsoft出版物都是关于.NET的。 - Cheeso
@Cheeso是正确的; COM是一种旧技术。微软正在专注于.NET用于大部分新开发,但COM开发仍然完全有效;只是你会发现大多数关于它的参考资料有点老旧。 - Paul Sonier
3
《Inside COM》是一本很好的书。当COM非常热门的时候,我读过几本COM的书,但这本书是最易懂的。Don Box的《Essential COM》是一本不错的第二本读物,但它包含了太多细节。与之相比,《Inside COM》更容易入门,并涵盖了主要内容。(我认为《Essential COM》中并不是所有内容都是必要的!) - John D. Cook

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接