- 1、本文档共45页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
COM技术初探作者:venture
目录
一.COM是一个更好的C++
COM是什么
从C++到DLL再到COM
2.1C++
DLL
COM
二.COM基础
COM基本知识
返回值HRESULT
初识idl
IUnkown接口
一个比较简单的COM
interface.h文件
math.h文件
math.cpp文件
simple.cpp文件
Math组件的二进制结构图
小结
三.纯手工创建一个COM组件
从建工程到实现注册
创建一个类型为win32dll工程
定义接口文件
增加注册功能
增加一个MathCOM.def文件
DllRegisterServer()和DllUnregisterServer()
MathCOM.cpp文件
小结
实现ISmipleMath,IAdvancedMath接口和DllGetClassObject()
实现ISmipleMath和IAdvancedMath接口
COM组件调入大致过程
DllGetClassObject()实现
客户端
小结
类厂附录
A我对dll的一点认识一.没有lib的dll
建一个没有lib的dll
调试没有lib的dll
二.带有lib的dll
创建一个带有lib的dll
调试带有引用但没有头文件的dll三.带有头文件的dll
创建一个带有引出信息头文件的dll
调试带有头文件的dll四.小结
一、COM是一个更好的C++
1、COM是什么
DonBox说COMISLOVE。COM的全称是ComponentObjectModel组件对象模型。
2、从C++到DLL再到COM
2.1C++
如某一软件厂商发布一个类库(CMath四则运算),此时类库的可执行代码将成为客户应用中不可分割的一部分。假设此类库的所产生的机器码在目标可执行文件中占有4MB的空间。当三个应用程序都使用CMath库时,那么每个可执行文件都包含4MB的类库代码(见图1.1)。当三个应用程序共同运行时,他们将会占用12MB的虚拟内存。问题还远不于此。一旦类库厂商发现CMath类库有一个缺陷后,发布一个新的类库,此时需要要求所有运用此类库的应用程序。此外别无他法了。
图1.1CMath的三个客户
DLL
解决上面问题的一个技术是将CMath类做成动态链接库(DLL,DynamicLinkLibrary)的形式封装起来。
在使用这项技术的时候,CMath的所有方法都将被加到CMathdll的引出表(exportlist)中,而且链接器将会产生一个引入库(importlibrary)。这个库暴露了CMath的方法成员的符号。当客户链接引入库时,有一些存根会被引入到可执行文件中,它在运行时通知装载器动态装载CMathDll。
图1.2CMath引入库当CMath
图1.2CMath引入库
COM
简单地把C++类定义从dll中引出来这种方案并不能提供合理的二进制组件结构。因为C++类那既是接口也是实现。这里需要把接口从实现中分离出来才能提供二进制组件结构。此时需要有二个C++类,一个作为接口类另一个作为实现类。让我们开始COM之旅吧。
二、COM基础
1、COM基本知识
返回值HRESULT
COM要求所有的方法都会返回一个HRESULT类型的错误号。HRESULT其实就一个类型定义:
typedefLONGHRESULT;
有关HRESULT的定义见winerror.h文件// Valuesare32bitvalueslayedoutasfollows:
//
// 3322222222221111111111
// 10987654321098765432109876543210
// +-+----+-------------------------+---------------------------------+
// |S|Res| Facility | Code |
// +-+----+-------------------------+---------------------------------+
//
// where
//
// S-istheseveritycode
//
// 0-Success
// 1-Error
//
// Res-isareserve
文档评论(0)