开发工具:
文件大小: 272kb
下载次数: 0
上传时间: 2019-07-14
详细说明:面向对象方法学COM组件笔记,需要下载,面向对象方法学COM组件笔记,需要下载,7、COM组件与程序模块的不同
COM组件发布后是二进制形式的模块,用户通过实现定义的接口访问组件。
程序模块是由一些源代码组成,用户可以通过继承或建立新对象来访问
COM组件可以动态组装,而程序模块是固化的,缺少灵活性。
8、采用何种技术手段区分不同的组件?
答:用户与组件交流是通过接口完成的,如果能确定两个接口是不是属于同一个组件就能确
定两个组件是不是同一个组件,而每个组件都有唯一的 IUnknown接口,通过其他接口来
查询这个接口,如果返回相同的指针说明是同一个组件,否则是不同的组件。
9、简述 IUnknown接口中三个函数的作用
答: Quervlnterface作用:对组件的接口进行查询,若存在某个接口,客户可以获得该接
口,从而获得该接口中提供的服务。这个规定是因为COM组件之间是动态组合的,对
个组件使用前,必须确认它具有所需要的服务。即:先确认,后使用。这与一般程序中对对
象的使用是不同的。
AddRef和 Release函数作用:两者通过计数器共同完成引用计数的功能,为知道
个组件何时没有客户,利用一个计数器来记录该组件的使用情况,也可为每个接口安排一个
计数器,当所有的接口的计数器为0时,意味着该组件不存在客户∫,可以从内存中卸载。
10、简述COM组件技术中 Unknown接口的作用。
所有组件都有一个称为 Unknown的接口。该接口中依次给出的三个函数是:
QucryIntcrfacc、 Addre、 Rclcasc
QucryIntcrfacc作用:对组件的接口进行查询,COM组件之间是动态组合的,在一个
组件使用之前必须确认它所具有的服务,即:先确认,后使用
Addref和 Release通过计数器共同完成引用计数功能。当组建所有接口的计数器都为
时,意味着该组件不存在客户了,可以从内存中卸载
11、COM为了支持动态链接,给出的相关规范内容是什么?
(COM组件的接口规定【三点】)
接口规定
对接口进行规定,是为了达到COM组件标准提出的目标
(1)所有组件都有一个称为 IUnknown的接口(未名接口),该接口中依次给出三个函
数是: QueryInterface, AddRef, Release
Querylnterface的作用是对组件的接冂进行查询,若存在某个接∏,客户可以获得该接冂
从而获得该接口中提供的服务。这个规定是因为COM组件之间是动态组合的,对一个组
件使用前,必须确认它只有所需要的服务。即:前确认,后使用。这与一般程序中对对象的
使用是不同的。这乜是com支持动态链接技术的根本原因
AddRef和 Release通过计数器共同完成引用计数功能。
(2)其他接口
个组件的其它接口可以看作 IUnknown接口的子接口,其它任何一个接口的前三个
区数与 IUnknown接口中的三个函数相同。客户获得一个接口后可以查询其他接口是否存
在。每个接口能够进行引用计数
(3)不变性:
旦公布了某个接∏,该接冂将永远不能发生任何变化。包括函数在接∏中的顺序。
改变接口部分的唯一方式是:为组件增加新的接口。目的是兼容。版本升级不影响老客户。
一个接口有唯一的接口标识(ID)。一个组件也有唯一的一个标识。对接口中函数的确定,
本质上是通过位置确定的。
12、接口唯一性的理解
三条:不变性,ID唯一,添加新的更改。
接口的I是唯一标识,用 UNkown接口查询这个接口,用得到的地址进行区别,不同版本
同一功能的接口因I不同,仍不是统一接口。用途在于保证兼容性
13、〔OM组件规范针对组件实例的内存管理,给出的规范内容是什么,基本原理是什么?
AddRef和 Release通过计数器共同完成引用计数功能,实现组件的卸载。一个组件可以
同吋被多个客户所使用,使用吋需要载入到内存中。无论哪个客户把它载入内仔,任何的
个客户都不能决定何时把它从内存中卸载,因为不知道是否还有其它客户在用它。为了知道
何时这个组件没有客户,利用计数器来记录该组件的使用情况。实际上,可以为组件的每个
接口安排一个计数器,用来记录每个接口的使用情况。当所有接口的计数器为0时,意味
这该组件不存在客户了,可以从内存中卸载。
14、简述引用计数器及 IUnknown接口中的 AddRef和 Release函数的作用。
答:(1)当客户从组件取得个接∏时,此引用计数值将增加1,当客户使用完某个接∏
后,组件的引用计数将减1,当引用计数为0时,组件即可将自从内存删除。
(2) Addref和 Release通过计数器共冋完成引用计数功能。为知道一个组件何时没有客
户,利用一个计数器来记求该组件的使用情况,也可为每个接口安排一个计数器,当所有接
口的计数器为0时,意味着该组件不存在客户了,。可以从内存卸载了。
15、用C++或Java给出 IUnknown接口中 QucryIntcrfacc函数原型的设计,并简述该
函数的参数及返回结果的语义。
答:(1)函数原型: hrESULT stdcall! Querylnterface( const lid&id,void*ppv);
(2)参数及返回值:第一个参数是标识客户所需要的接口,此参数是一个“接口标识符
(I)结构。第二个参数是存放所请求接口指针的地址。 Querylnterface返回的是一个
HRESULT值,是·个具体特定结构的32位值。可返回SOK或 E NOINTERFACE。
16、接口不变性规范的内容是什么?其目的是什么?
答:一旦公布了某一个接口,该接口将永远不能发生任何变化,包括函数在接口中的顺序,
改变接口韶分进行组件升级的唯一方式是:为组件増加新的接口,口的是兼容
17、如何区分两个不同的COM组件
利用 IUnKnown接口的值,查询这个接口的值,用这个得到的地址进行区别,如果两个
0M组件的这个值相同,则表明是同一个组件,否则不是
18、在实现COM组件时,一般提供类厂接冂 IClassfactory,简述该接口的作用。
答:类厂接口 IClassfactory是创健组件的标准接口,客户可以通过类厂组件创建其他组
件。类厂组件的唯功能就是创建其他的组件。
CoCreateinstance函数是创建组件的时侯使用最多的一种方法,但是它的灵活性不能够
满足所有组件的需求,它没有给客户提供一种能够控尙组件创建过栏的方法,在建立好一个
组件之后,无法控制将组件装载或检查客户是否有权限。因此需要引入类厂以获得更高的灵
活性。 CoCreateinstance实际上并没有直接创建组件,用 CoCreateInstance创建的组件实际
上是通过 IClassfactory创建的
客户可以通过类厂所支持的接口来对类厂创建组件的过程加以控制,创建组件
的标准接∏就是 IClass Factory。客户可以通过类厂组件创建其他组件。
类厂作用:是产生组件实例,让客户自主控制实例产生。
类厂接口作用:告诉客户工厂是什么,怎么使用
9、coM组件要增加一个接口怎么做?
假设组件B有∏,1两个接口,在B上增加一个接口13使之成为组件A有两种方法:1)
裹合。A借用B的1,12,自己实现13,A作为B的客户,代码中可见B的接口,A中包括
真正的实体,代码中要定义接口)实现。2)A仅实现13接口,把B的,12直接暴露出去。
20、COM支持动态链接的基本原理,即为什么COM的相关规范能够支持动态链接。
答: Querylnterface是将编写C++类的过程区分开的一种特性,COM组件的灵活性和封装
性大多数由 QueryInterface提供,它使得用广可以在运行时决定个组件所提供的功能,并
最大限度地使用动态链接
21、CoM为什么使用DLL?
DLL可以共享它们所连入的应用程序地址空间,一个接口实际上是指一个指向函数的
指针列表(vtbl)。客户应可访问组件为其vbl分配的内存,而且还必须能理解各个放入vbl
之中的各个地址,在 windows中,动态链接库与客户使用的是同一地址空间,动态链接库
将驻留在所链接应用程序的地址空间之中,因此访问vtbl不成问题
22、复用已有的COM组件,可以设计并实现新的COM组件,但对于任意一个COM组
件,如果支持被其他的COM组件复用,需要进行合理的设计,并在允许被其他COM组
件复用的情况下,简述利用动态链接库实现COM组件的一般步骤
(实现COM组件的步骤编写COM组件的步骤)
答:
(1)定义各业务接口,各接口都能继承 IUnknown接口;
(2)为每个组件和接口分配一个唯一的标识;
(3)实现各业务接口的功能;假的 IUnknown接口,留一个指针指向被调用组件,被聚合
寸,指针指向了组件,如果不是复用,指针为空,有一个真的 IUnknown接口实现本身内
容,返回工厂实例,参数包括:组件ID,L厂ID,返回指针。
(4)定义类厂接∏并分配唯标识符;(此接冂继承自 IClassFactory接冂)
(5)实岘类厂接口并实现动态生成组件
(6)编写DLL,并定义编写导出函数。在DLL函数中有注册组件到注册表的函数、取消
注册的函数、与类厂相连的函数。(如果己向注册表申请注册,则说明已转化为系统静态库
函数,不能动态生成,而是于库中声明并生成完毕。)
23、COM组件的两种复用方式:包容和聚合
包容:外部组件完全控制内部组件的生存期,外部组件声明与內部组件相冋的接口从而
对内部组件接口进行扩充
聚合:内部组件的接口直接对外公开
24、COM组件总体概括图
客户
COM库
DEL
调用
CoGetClassobject
DLLGetClass obiect
CoGet ClassObiect
4返回 Classhacton
创建类厂
pIClassFactory调用5
IClass Factory Createlnstane
IClassfactory
7返回区
p
8调用Dx
创建组件
25、使用与实现分离的理解
程序开发者在编写代码过程中,不必关心某些內容的具体实现方式,只要知道如何运用,
并能够很好的使用到程序开发中即可,是软件开发中的一个重要部分,能够简化开发流程。
26、在利用动态链接库( ynamic Link Library DLI)实现一个COM组件时,为了能够让
客户程序控制组件实例产生的时机及个数,如何设计导出函数及相关的接口。
1)首先实现声明一个类厂 IClassfactory,该类厂继承 IUnknown接口,在类厂接凵中声明
CreateInstance函数,用于创建接口实例
struct IClassFactory: public IUnknown,
virtual bool Crealelnstance(int nlid void* ppvobj=O)
2)开始设计导出函数,其函数原型如下
bool GetClass Object(int cLsid,int nlid, void**ppvobj)
n clsid:需要导出的组件I
nid:组件中待导出的接口ID
ppvobj:待导出组件的接口的类厂的指针
返回类型:bool,如果成功得到了该接口的类厂的指针,返回True,否则 False
3)客户在设计并实现了导出函数 GetClassObject后可以在需要COM组件接口时调用该
凶数得到组件接口的类厂指针 ppvobj,然后调用类厂中的¢ reateInstance方法,创建接口实
例并根据客户多次需要多次调用并创建多个实例。
27、简述你对动态链接库概念的理解。(定义,作用,优点)
答案一:不对那些组成程序的目标文件进行链接,等到程序要运行时才进行链接,也就是说
把链接过程摧迟到运行时再进行。
动态链接是一种用户在应用程序运行时能够组件替换掉的技术。使用组件的优势在于用
户可以动态地将组件插入或者从应用稈序卸载。在运行时能够改变组件,因此我们要将组件
动态地链接起来,这可以解决当需改变组件时不得不重新编译链接的问题
答案二:组件能够动态的被调用和释放,即能够在应用程序的运行过程中动态使用,不是在
发布应用程序的时候就把组件和应用放在一起,而是分离的,只有程序运行的时候,组件和
程序才会有机地结合在一起。
28、动态链接库需要解决的问题是什么?
1)至少要有两个运行的实体
2)要保证关系的合理性(COM组件的灵活性和封装性大多数由 Querylnterface提供,它
使得用户可以在运行时决定一个组件所提供的功能,并最大限度的使用动态链接。)
29、动态链接库使用组件的环节
1) loadlibrary将lib载入内存
2)定义函数指针,从动态链接库中查找地址
3)利用名字查找导出函数
4)利用指针调用函数
5) freelibrary,卸载动态链接库
30、为什么可以使用DIL实现组件
能共享应用程序的地址空间
31、组件和DLL的关系
组件应看成在DLL所实现的接口集,DLL只是一种形式,组件是实质
32、简述调用COM组件的步骤
COM组件的创建可以通过 CoCreateinstance函数来完成。 Cocreateinstance在函数内部
实现中通过调用 CoGetclassobject函数先创建一种专门用来创建组件的组件来解决此问题,
这种用途的组件被称为类厂。
类厂所支持的用以创建组件的接口是 IClass Factory,该接口从 IUnknown接口派生,并
具有两个自己的接口成员函数 CreateInstance和 LockSever。这两个成员函数分别用来创建
COM组件对象和控制组件的生存期。创建类厂的 CoGetClassobject函数将接收一个CLSI
作为参数并返回指向类厂对象 IClass factory按口的指针。客户将可以通过此指针来创建所需
要的组件并返回某接∏的指针,通过此指针,客广将可以直接调用新创建的COM对象接冂
的成员函数,从而获得COM对象的所有服务。
在用 CoGetclassobject创建类厂对象时,如果COM对象是进程内组件(组件与客户处
于同一进程地址空间,通常多以DLL形式存在), CoGctclassObjcct将调用DLL模块的
DllGetClassObject引出函数并把 clsid、id和ppv等参数传递进去以创建类厂,并返回类厂
对象的接口指针;如果COM对象是进程外组件(拥有独立的进程地址空间,通常多以EXE
形式存在),则 CoGetClassObject将要首先启动组件进程,并一直等待到组件进程通过
CoRegisterClassobject函数将类厂注册到COM后,才会返回COM相应的类厂信息。
33、动态链接库( Dynamic Link Library DlL使用
extern“C
Unknown*Createlnstanceo
IUnknown*pl(IUnknown ) (void *)new CA
pl-AddRefo
rcturn
34、两种导出方式
CMPNT1DF(模块定义文件)
LIBRARY
compntl. dll
DESCRIPTION‘任意描述信息
EXPORTS
CreateInstancea1 PRIVatE
DLL中导出函数声明
extern"C"(dllexport)IUnknown* Createlnstanceo
35、装载的关键代码
typedef IUnknown(CREATEFUNCPTR)O
IUnknown*CallCreatelnstance(char*name),
HINSTANCE hComponent=: LoadLibrary (name
if(hComponent--NULL)i
cout<<“ allcreaunstance: annot load.”≤endl;
return NULL
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.