COM技术内幕笔记

1.  _stdcall是指被调用的函数会在返回调用者时自行负责将参数等从栈中移除。所有的Win32 API都是使用这个调用约定的,带有变参的函数还是使用_cdecl。Windows使用_stdcall是因为这种约定可以减少代码大小,而且早期Windows是运行在640KB内存的机器上的。
2.  CoCreateInstance:使用指定的clsid创建一个未初始化的COM对象。Call CoCreateInstance when you want to create only one object on the local system. To create a single object on a remote system, call the CoCreateInstanceEx function. To create multiple objects based on a single CLSID, call the CoGetClassObject function.
3.  CoCreateInstance创建组件的过程是这样的,传给它一个CLSID,然后它创建相应的组件,并返回指向所请求的接口的指针。CoCreateInstance没有给客户提供一种能够控制组件创建过程的方法。当CoCreateInstance返回后,组件就已经创建好了。在创建完成后再试图去控制组件应该被加载到内存中何处,或检查客户是否有权限创建该组件已经不可能了。这是CoCreateInstance的不灵活之处。
4.  IClassFactory接口
5.  CoGetClassObject:
6. Glossary:

server application :An application that can create COM objects. Container applications can then embed or link to these objects.
out-of-process server :A server, implemented as an .EXE application, which runs outside the process of its client, either on the same computer or a remote computer.
in-process server :A server implemented as a DLL that runs in the process space of the client.
container application :An application that supports compound documents. The container application provides storage for an embedded or linked object, a site for its display, access to the display site, and an advisory sink for receiving notifications of changes in the object.
client :A COM object that requests services from another object.
7. 为什么要创建out-of-process server?
??
8. out-of-process server有什么特殊之处
COM组件是一个exe,它会运行在一个独立的进程中,container application与其进行交互的时候需要跨越进程边界。COM使用LPC完成不同进程间的通信。只有在out-of-process server中才会用到IDL(interface definition language),然后使用MIDL编译器生成Skeleton和Stub。
9. DCOM是什么?
Distributed COM (DCOM) extends the Component Object Model (COM) to support communication among objects on different computers—on a LAN, a WAN, or even the Internet. With DCOM, your application can be distributed at locations that make the most sense to your customer and to the application.
Because DCOM is a seamless evolution of COM, the world's leading component technology, you can take advantage of your existing investment in COM-based applications, components, tools, and knowledge to move into the world of standards-based distributed computing. As you do so, DCOM handles low-level details of network protocols so you can focus on your real business: providing great solutions to your customers.
10. 组件与对象有什么关系?
组件是一个可重用的模块,它是由一组处理过程、数据封装和用户接口组成的业务对象(Rules Object)。组件看起来像对象,但不符合对象的学术定义。它们的主要区别是:

  1. 组件可以在另一个称为容器(有时也称为承载者或宿主)的应用程序中使用,也可以作为独立过程使用;
  2. 组件可以由一个类构成,也可以由多个类组成,或者是一个完整的应用程序;
  3. 组件为模块重用,而对象为代码重用。

11. ActiveX,OLE和COM的关系,为什么在讲COM时总是要提到OLE呢?
从时间的角度讲,OLE是最早出现的,然后是COM和ActiveX;从体系结构角度讲,OLE和ActiveX是建立在COM之上的,所以COM是基础;单从名称角度讲,OLE、ActiveX是两个商标名称,而COM则是一个纯技术名词。
既然OLE是最早出现的,那么就从OLE说起,自从Windows操作系统流行以来,“剪贴板”(Clipboard)首先解决了不同程序间的通信问题(由剪贴板作为数据交换中心,进行复制、粘贴的操作),但是剪贴板传递的都是“死”数据,应用程序开发者得自行编写、解析数据格式的代码,于是动态数据交换(Dynamic Data Exchange,DDE)的通信协定应运而生,它可以让应用程序之间自动获取彼此的最新数据,但是,解决彼此之间的“数据格式”转换仍然是程序员沉重的负担。对象的链接与嵌入(Object Linking and Embedded,OLE)的诞生把原来应用程序的数据交换提高到“对象交换”,这样程序间不但获得数据也同样获得彼此的应用程序对象,并且可以直接使用彼此的数据内容,其实OLE是Microsoft的复合文档技术,它的最初版本只是瞄准复合文档,但在后续版本OLE2中,导入了COM。由此可见,COM是应OLE的需求而诞生的,所以虽然COM是OLE的基础,但OLE的产生却在COM之前。
COM的基本出发点是,让某个软件通过一个通用的机构为另一个软件提供服务。COM是应OLE的需求而诞生,但它的第一个使用者却是OLE2,所以COM与复合文档间并没有多大的关系,实际上,后来COM就作为与复合文档完全无关的技术,开始被广泛应用。这样一来,Microsoft就开始“染指”通用平台技术。但是COM并不是产品,它需要一个商标名称。而那时Microsoft的市场专家们已经选用了OLE作为商标名称,所以使用COM技术的都开始贴上了OLE的标签。虽然这些技术中的绝大多数与复合文档没有关系。Microsoft的这一做法让人产生这样一个误解OLE是仅指复合文档呢?还是不单单指复合文档?其实OLE是COM的商标名称,自然不仅仅指复合文档。但Microsoft自己恐怕无法解释清楚,这要花费相当的精力和时间。
于是,随着Internet的发展,在1996年春,Microsoft改变了主意,选择ActiveX作为新的商标名称。ActiveX是指宽松定义的、基于COM的技术集合,而OLE仍然仅指复合文档。当然,ActiveX最核心的技术还是COM。ActiveX和OLE的最大不同在于,OLE针对的是桌面上应用软件和文件之间的集成,而ActiveX则以提供进一步的网络应用与用户交互为主。到这里,大家应该对ActiveX、OLE和COM三者的关系有了一个比较明确的认识,COM才是最根本的核心技术,所以下面的重点COM。
让对象模型完全独立于编程语言,这是一个非常新奇的思想。这一点从C++和Java的对象概念上,我们就能有所了解。但所谓COM对象究竟是什么呢?为了便于理解,可以把COM看作是某种(软件)打包技术,即把它看作是软件的不同部分,按照一定的面向对象的形式,组合成可以交互的过程和以组支持库。COM对象可以用C++、Java和VB等任意一种语言编写,并可以用DLL或作为不同过程工作的执行文件的形式来实现。使用COM对象的浏览器,无需关心对象是用什么语言写的,也无须关心它是以DLL还是以另外的过程来执行的。从浏览器端看,无任何区别。这样一个通用的处理技巧非常有用。例如,由用户协调运行的两个应用,可以将它们的共同作业部分作为COM对象间的交互来实现(当然,现在的OLE复合文档也能做到)。为在浏览器中执行从Web服务器下载的代码,浏览器可把它看作是COM对象,也就是说,COM技术也是一种打包可下载代码的标准方法(ActiveX控件就是执行这种功能的)。甚至连应用与本机OS进行交互的方法也可以用COM来指定,例如在Windows和Windows NT中用的是新API,多数是作为COM对象来定义的。可见,COM虽然起源于复合文档,但却可有效地适用于许多软件问题,它毕竟是处在底层的基础技术。用一句话来说,COM是独立于语言的组件体系结构,可以让组件间相互通信。
总结:
OLE是一种允许用户创建和编辑包含多个应用创建的items或者Object的文档,也叫做OLE文档,历史上称为复合文档compound documents。它在各个应用之间是交换对象的,而不是想DDE一样交换数据。从OLE2开始,为了更好地交换对象,MS发明了COM技术,OLE也是基于COM构建的。COM应OLE的需要而诞生。而OLE已经成为一种品牌,COM只是作为这个品牌的一部分了,所以,提COM的时候总会提到OLE。而OLE往往都是指桌面应用程序的,当进入网络环境时,基于COM的Active technology 成为软件之间互相通信的首要技术,虽然Active Technology也可以创建桌面应用。基于Active Technology的document叫做Active Document。


Reference:
1. http://msdn.microsoft.com/en-us/library/19z074ky(VS.80).aspx
2. http://msdn.microsoft.com/en-us/library/aa278598(VS.60).aspx 

原文地址:https://www.cnblogs.com/whyandinside/p/1560923.html