首页
Web开发
Windows程序
编程语言
数据库
移动开发
系统相关
微信
其他好文
会员
首页
>
其他好文
> 详细
COM基础
时间:
2015-04-15 16:51:21
阅读:
105
评论:
0
收藏:
0
[点我收藏+]
标签:
为什么说COM的可重用性是建立在二进制级别?
COM本身是语言无关,它的标准建立在二进制级别。对于使用COM组件的客户程序,它只需要要使用的COM对象信息就可以通过COM库的帮助创建和使用COM对象,不需要知道COM对象位于什么位置(dll 或者 exe),而且只能通过接口使用对象提供的服务,并不知道对象内部的实现过程。因为重用的是dll或者exe(组件被封装在其中),所以说COM是二进制级别的重用
按照COM规范,客户程序通过COM库完成对象的创建工作,COM库通过注册表所提供的信息进行组件的创建工作,
COM库:定义了组件程序和客户程序交互的规范,提供了COM的实现部分即COM库,COM库也充当了组件程序和客户程序之间的桥梁,尤其是在组件对象的创建过程中以及对象管理内存管理和一些标准化操作等。
COM库的初始化: HRESULT CoInitialize(IMalloc *pMalloc),通常一个进程对COM库只进行一次初始化,COM库初始化后就可以调用其中的函数。唯一的例外是DWORD CoBuildVersion函数可以在初始化前调用。使用完COM库服务后要调用void CoUninitialize(void)函数释放COM库所维护的资源
COM规范规定组件程序必须实现DllGetClassObject和DllCanUnloadNow,DllGetClassObject负责创建类厂对象,DllCanUnloadNow负责判断dll是否可以被卸载
组件程序把它所实现的COM对象的信息以及接口信息都保存到注册表中,这个步骤称为组件的注册
COM组件信息位于注册表\HKEY_CLASSES_ROOT\CLSID键下面,如果是进程内组件,则组件ID下面包含一个InproServer32的子键,该子键的default值是组件程序的全路径文件名.如果是进程外组件,组件ID下包含 一个LocalServer32的子键,该子键的default值是组件程序的全路径文件名
Windows系统中,除了用CLSID唯一标示一个COM对象外,还可以用字符串对组件对象命名,利用名字化的字符串来查找对象,这样的名字信息称为ProgID(program idenifier),在HKEY_CLASSES_ROOT键下可以找到以ProgID命名的子键,ProgID下又包含了两个子键CLSID和CurVer。CurVer包含了组件的当前版本。 CLSID和ProgID之间可以互相转换,COM提供了两个API函数CLSIDFromProgID和ProgIDFromCLSID用于两者的转换
自注册组件程序:提供了自注册能力的组件程序称为自注册组件程序,
对于自注册的进程内组件程序要在组件内提供用于组件注册的两个入口函数DllRegisterServer和DllUnregisterServer,这样就可以使用RegSvr32.exe完成注册.
RegSvr32 c:\DictComp\DictComp.dll(会调用DllRegisterServer)
RegSvr32 /u c:\DictComp\DictComp.dll(会调用DllUnregisterServer)
对于自注册的进程外组件COM规定进程外组件必须支持/RegServer和/UnRegServer参数以便完成注册和注销工作
非自注册组件程序:注册过程与组件程序没有直接关系,必须单独进行注册信息的配置,例如编写一个注册表文件通过RegEdit导入注册表
COM规定每一个COM对象类应该由一个相应的类厂对象,如果一个组件程序实现了多个COM对象,则相应有多个类厂。类厂本身也是个COM对象,它由DllGetClassObject创建,该函数不是COM库函数,它是组件程序实现的引出函数。
COM库接到创建对象的指令后,它调用进程内组件的DllGetClassObject函数,由该函数创建类厂对象,并返回类厂对象的接口指针,COM库或者客户一旦有了类厂的接口指针就可以通过类厂接口IClassFactory的成员函数CreateInstance创建相应的COM对象
在COM库中有三个API函数可以用于对象的创建,CoGetClassObject,CoCreateInstance,CoCreateInstanceEx
包容模型:B包容A重用A某个接口的功能,则B要继承A的这个接口,在实现中调用A的接口功能
聚合模型:B包容A重用A某个接口的功能,客户通过B query A接口时返回A的接口供客户程序使用
COM基础
标签:
原文地址:http://www.cnblogs.com/phenixyu/p/4428797.html
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年07月29日 (22)
2021年07月28日 (40)
2021年07月27日 (32)
2021年07月26日 (79)
2021年07月23日 (29)
2021年07月22日 (30)
2021年07月21日 (42)
2021年07月20日 (16)
2021年07月19日 (90)
2021年07月16日 (35)
周排行
更多
分布式事务
2021-07-29
OpenStack云平台命令行登录账户
2021-07-29
getLastRowNum()与getLastCellNum()/getPhysicalNumberOfRows()与getPhysicalNumberOfCells()
2021-07-29
【K8s概念】CSI 卷克隆
2021-07-29
vue3.0使用ant-design-vue进行按需加载原来这么简单
2021-07-29
stack栈
2021-07-29
抽奖动画 - 大转盘抽奖
2021-07-29
PPT写作技巧
2021-07-29
003-核心技术-IO模型-NIO-基于NIO群聊示例
2021-07-29
Bootstrap组件2
2021-07-29
友情链接
兰亭集智
国之画
百度统计
站长统计
阿里云
chrome插件
新版天听网
关于我们
-
联系我们
-
留言反馈
© 2014
mamicode.com
版权所有 联系我们:gaon5@hotmail.com
迷上了代码!