COM组件的运行机制,即COM是怎么跑起来的
com文件和exe文件的结构是怎么样的

com文件和exe文件结构1、com文件结构及原理com文件结构比较简单,它包含程序的一个绝对映像,即为了运行程序准确的处理器指令和内存中的数据,MS-DOS通过直接把该映像从文件直接复制到内存,从而加载com程序,而不做任何改变。
为加载一个com程序,MS-DOS首先试图分配内存,因为com程序必须位于一个64KB 的段中,所以com文件的大小不能超过65024(64KB减去用于PSP的256B和用于一个起始堆栈的至少256B)。
如果MS-DOS不能为程序、一个PSP、一个起始堆栈分配足够的内存,则分配尝试失败。
否则,MS-DOS分配尽可能多的内存(直至所有保留内存),即使com程序本身不能大于64KB。
在试图运行另一个程序或分配另外的内存之前,大部分com程序释放任何不需要的内存。
分配内存后,MS-DOS在该内存的前256B建立一个PSP,如果PSP中的第一个FCB 含有一个有效驱动器标识符,则置AL为00H,否则置位0FFH。
MS-DOS还置AH为00或0FFH,这依赖于第二个FCB是否含有一个有效驱动器标识符。
建造PSP后,MS-DOS 在PSP后立即开始(偏移100H)加载com文件,它置SS、DS和ES为PSP的段地址,接着创建一个堆栈。
为创建这个堆栈,在已分配了至少64KB内存的情况下,MS-DOS置SP为0000H;否则它置寄存器比所分配的自己总数大2的值。
最后,将0000H进栈(这是为了保证与在早期MS-DOS版本上设计的程序的兼容性)。
MS-DOS通过把控制传递给偏移100H处的指令而启动程序。
程序设计者必须保证COM 文件的第一条指令是程序的入口点。
注意:因为程序是在偏移100H处加载,因此所有代码和数据偏移也必须相对于100H。
汇编语言程序设计者可通过设置程序的初值为100H而保证这一点(例如通过在源程序的开始使用语句org 100h)。
com文件格式/PSP文件结构程序空余出的0x100的空间,由DOS生成。
第19章 组件对象模型(COM)解析

新建ATL COM应用程序
设置ATL COM项目属性
19.3.2 创建新的ATL对象
• 要是ATL COM项有所作为,必须建立自定义的ATL对象。 • 单击“Insert”菜单,选中“New ATL Object”选项,在弹出的 ATL对象向导对话框中选中相应“Objects”对应右侧的“Simple Object”选项,如图19.4所示,选中后单击“Next”按钮。 • 如图所示,在单击“Next”按钮后,弹出的对话框如图所示,填 写对象名为“HelloMyATL”。
19.3.6 运行效果和小节
• 按F5键编译并运行“HelloOffice”项目,如果能正常编译通过, 则表明该项目已经顺利完成,并在输出目录下会生成一个 “HelloOffice.dll”文件,该文件已经在程序中注册了,因此无 需读者再进行手动注册,然后,打开Office Word软件,会发现如 图所示的效果。
19.3.4 导入Office接口文件
• 要与Office关联起来,需要导入Office给其他开发者提供的二次接口文件。 一个是“MSO.dll”,另一个是“MSWORD.OLB”。在“stdafx.h”头文件 中加入如下语句: #import "C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE10\\mso.dll" \ rename_namespace("Office") named_guids,exclude("Pages") using namespace Office; #import "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.olb" rename_namespace("VBE6") using namespace VBE6; #import "C:\\Program Files\\Microsoft Office\\OFFICE\\MSWORD9.OLB" rename("ExitWindows","ExitWindowsEx") #import "C:\\Program Files\\Microsoft Office\\OFFICE\\MSWORD9.OLB" \ rename_namespace("Word"), raw_interfaces_only, named_guids ,exclude("Pages") using namespace Word;
COM组件简介

COM组件简介面向对象的思想难以适应这种散布式软件模型,于是组件化程序设计思想取得了迅速的进展。
依照组件化的程序设计的思想,复杂的应用程序被设计成一些小的,功能单一的组件模块,这些组件模块能够运行在同一台机械上,也能够运行在不同的机械上。
为了实现如此的应用软件,组建程序和组建程序之间需要一些极为细致的标准,只有组件程序遵守了这些一起的标准,然间系统才能正常运行。
为此,OMG和Microsoft别离提出了CORBA(Common Object Request Breaker Architecture)和COM(Component Object model)标准,目前CORBA模型要紧应用于UNIX操作系统平台上,而COM 那么要紧应用于Microsoft Windows操作系统平台上。
在COM标准中,一个组件程序也被称为一个模块,它能够是一个动态连接库(DLL), 被称为进程内组件(in-of-process component)也能够是一个可执行程序(EXE),被称为进程外组件(out-of-process component).COM对象是成立在二进制可执行代码级的基础上,而C++等语言中的对象是成立在源代码级基础上的,因此COM对象是语言无关的。
这一特性利用不同编程语言开发的组件对象进行交互成为可能。
在Microsoft Windows系统平台上,COM技术被应用于系统的各个层次,从底层的COM对象治理到上层的应用程序交互都用到了COM标准。
概述COM既提出了组件之间进行交互的标准,也提供了实现交互的环境,因为组件对象之间交互的标准不依托于任何特定的语言,因此COM也能够是不同语言协作开发的一种标准。
OLE技术以COM标准为基础,OLE充分发挥了COM标准的优势,使Windows操作系统上的应用程序具有极强的可交互性。
若是没有OLE的支持,Windows操作系统那么会逊色很多。
可是,COM标准并非局限于OLE技术,事实上,OLE技术只是COM的一个应用罢了,这几年,OLE 技术在进行网络互连是显示出了专门大的局限性,而COM那么表现出了极强的适应能力。
结构化存储

1、结构化存储COM的结构化存储(structured storage)机制,也称为永久存储(persistent storage)机制。
结构化存储可以说是软件存储技术的一个重要进展,COM针对组件软件的需要,在文件系统的基础上,提出了结构化存储的概念。
利用结构化存储,组件程序之间可很好地协同工作,一个组件程序可以与另一个组件程序共享同一个文件,就如同一个应用程序与另一个应用程序共享同一个磁盘文件系统一样。
COM定义了结构化存储的规范,包括一组接口和实现这些接口成员函数的一些规则;同时COM也提供了结构化存储的实现,即复合文档技术。
复合文档技术是 OLE的基础。
OLE最初的目标是在文档中嵌入或链接对象,当然现在OLE的发展已经超出了这个范围,但复合文档仍然是OLE的基础存储技术。
2、结构化存储的引入组件化程序设计方法把应用系统设计成多个组件程序,如何在这些组件程序之间以共享方式访问同一个文件是组件化程序设计必须要解决的问题。
而多个组件通过文件句柄访问共享文件难以实现,结构化存储技术“借用”文件系统的概念,在文件内部构造了一个类似于文件系统的树状层次结构,解决了这一问题。
结构化存储的层次结构的节点可以是两种对象:存储对象和流对象,每个存储对象或者流对象都是一个可独立进行读写操作的对象,组件程序只对它拥有的节点对象进行操作。
从应用系统整体上看,这些组件程序在共享访问同一个文件。
3、文件系统操作系统的诞生把应用程序与底层存储设备隔离开来,操作系统为应用程序的运行提供了基本的抽象环境,它可以处理所有与存储设备有关的基本操作。
同时,操作系统引入了文件系统的概念,允许多个应用程序共享同一个存储设备。
而且,操作系统为应用程序提供了一种抽象的流式存储结构,应用程序仍然独立地访问它自己的存储空间,不同应用程序相互之间不受干扰。
4、文件系统与结构化存储的框图5、存储对象和流对象对于一个完整的存储操作来说,它被分为两个层次:应用程序调用API函数;操作系统提供API函数的实现。
COM组件技术介绍

软件发展趋势
❖ 组件软件、软件组件
– 中间件市场已经形成
❖ 软件基础设施的重要性
– 经验和成果的重用
❖ 软件的可重用性要求
– 重用粒度不同
❖ API的多样化 ❖ 软件方案(solution),consulting市场
组件软件
❖ 部分升级
– 补丁 – 缩短软件的更新周期
❖ 增加了异构软件的可能
– 标准接口、标准规范、标准协议
❖ 变种:
– B/S
概念:软件层次思想
❖ 垂直层次
❖ 层次之间采用“接口与实现”分离的原则
❖ 理解层次的思想有助于理解整个系统或者整个 应用
– 对于计算机而言,层次是逻辑的,它是计算机软件 领域中的发展空间
– 层次使得软件更加有序、有组织、有条理 – 层次的代价:效率、体积庞大
概念:其他
❖ 现代软件的发展形成了很多重要的概念
– 身份确定 – 封装 – 可重用
IUnknown
Interface1 Interface2
Object
COM:组件
❖ COM对象的载体
– 包含多个COM对象
❖ 进程内组件
– DLL
❖ 进程外组件
– EXE
COM:进程内组件
❖ Inproc server
– Export Entrys
客户
组件
COM:进程外组件
❖ MTS和COM+
COM:COM体系
❖ 基本的功能 ❖ 扩展功能
– 连接点 – 结构化存储 – 名字服务 – 自动化 – 其他
❖ COM+
COM:COM+
❖ 建立在COM的基础上,COM的自然 延伸
《COM原理与应用》学习笔记一

《COM原理与应⽤》学习笔记⼀ 为了学习ActiveX插件的编写,从这⼏天开始学习COM原理。
ActiveX是以COM为基础的,所以要想要⽐较深⼊的学习ActiveX技术需要先学习COM原理。
COM是微软提出的组件标准。
COM是在OLE技术的发展过程中产⽣的。
OLE主要是实现复合⽂档,⽽且OLE1也只实现了复合⽂档的功能,OLE1使⽤的是⼀种被称为动态数据交换(DDE, Dynamic Data Exchange)的技术。
其中DDE技术建⽴在Windows的消息基础之上,DDE有稳定性不好、效率低的缺点。
所以,DDE很快的就被淘汰了。
在OLE的第⼆个版本OLE2中,微软重写了OLE的⼤量底层代码,推出了新的COM模型。
(以上内容摘⾃《COM原理与应⽤》,p10) COM包括了两个部分,⼀个是COM的规范,另⼀个就是提供组件程序运⾏所需要的环境。
COM组件可以被视为⼀个模块,这个模块可以使动态链接库(Dll),也可以使⼀个可执⾏⽂件。
⽽且COM的实现是在⼆进制代码上,不存在语⾔不同不能调⽤的情况,可以做到夸语⾔调⽤。
⽽且现在⼤多数语⾔都⽀持COM,如C++、Java等主流语⾔都是⽀持COM的。
COM的优势:我在最开始看COM的时候,就想到了这么⼀个问题。
为了使⽤其他组件提供的功能,需要使⽤很多重复⽽⿇烦的函数来载⼊组件,这不是很⿇烦么,⼲嘛不直接使⽤dll解决问题得了。
后来想了想,使⽤COM有⼏个优势。
dll需要加载进⼊进程中去,⽽COM可以提供进程外的调⽤,甚⾄可以调⽤远程计算机上的组件。
同时dll加载到进程中去以后,⼀旦dll中的函数崩溃,那么主进程也会崩溃。
如果这是使⽤进程外调⽤,那么主进程仍然可以稳定的运⾏。
⾯对⼀个具有很多功能的⼤型程序,我们都会很⾃然的想到把这些功能分成⼏个⼩块来实现。
这样⽅便开发、测试以及维护。
这些⼀个个的⼩模块就是组件。
COM是⼀种⾯向对象的组件模型,⽀持继承、数据的封装等。
COM原理及组件开发ppt课件

事务支持
分布式构件服务
资源分发管理
安全模型
COM
易于管理
基于接口的编程模型
基本的构件服务
精选课件ppt
9
什么是COM?
COM(Component Object Model),组件对象模型,是一 种以组件为发布单元的对象模型,这种模型使得各个软件组件 可以用一种统一的方式进行交互 COM是一种协议,它建立了一个软件模块同另一个软件模 块之间的连接,提供了组件之间进行交互的规范,也提供了实 现交互的环境
virtual ULONG_stdcall Release() = 0;
}
精选课件ppt
16
基本概念:接口定义语言
微软接口定义语言MIDL(Microsoft Interface Definition
Language)是定义COM接口的申述式语言
通过独立于具体编程语言的方式来定义接口
该语言基于OSF分布式计算环境(DCE)远程过程调用
接口定义例:
interface IDictionary
{
HRESULT Initialize();
HRESULT LoadLibrary([in] string);
HRESULT InsertWord([in] string, [in] string);
HRESULT DeleteWord([in] string);
精选课件ppt
25
接口查询
一个COM对象(构件)可以实现多个接口. 使用QueryInterface查询某个构件是否支持某个特定的接口
void foo(Iunknown * pI){
IX * pIX = NULL;
HRESULT hr = pI->QueryInterface(IID_IX,
COM原理讲述

COM原理COM是更好的C++C++:如果是静态连接的话,发布一个类库,此时类库的可执行代码将成为客户应用中不可分割的一部分。
当三个应用程序都使用这个库时,那么每个可执行文件都包含类库代码。
一旦类库厂商发现类库有一个缺陷后,发布一个新的类库,此时需要编译所有运用此类库的应用程序。
DLL:代码共享,解决上面问题的是将类库做成动态链接库(DLL ,Dynamic Link Library)的形式封装起来。
类库所有方法都将被加到dll 的引出表(export list)中,而且链接器将会产生一个引入库(import library)。
这个库暴露了库的方法成员的符号。
当客户链接引入库时,有一些存根会被引入到可执行文件中,它在运行时通知装载器动态装载dll。
COM:因为C++类那既是接口也是实现。
这里需要把接口从实现中分离出来才能提供二进制组件结构。
此时需要有二个C++类,一个作为接口类另一个作为实现类。
COM基础返回值:COM要求所有的方法都会返回一个HRESULT类型的错误号。
HRESULT 其实就一个类型定义;typedef LONG HRESULT。
有关HRESULT的定义见winerror.h 文件// Values are 32 bit values layed out as follows:// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0// +-+----+-------------------------+---------------------------------+// |S| Res| Facility | Code |// +-+----+-------------------------+---------------------------------+// where// S - is the severity code// 0 - Success// 1 - Error// Res- is a reserved bit// Facility - is the facility code// Code - is the facility''s status codeIDL:每个标准的COM组件都需要一个接口定义文件,文件的扩展名为IDL。