网站大量收购闲置独家精品文档,联系QQ:2885784924

C的OM学习笔记+++.doc

  1. 1、本文档共29页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C的OM学习笔记

COM学习笔记(一)初识COM COM--ComponentObject Model,组件对象模型。一向以难学著称,有人曾说过这样的话:世界上只有两个程序员真正理解COM,他们都在微软工作。这句话虽然有点过,但基本上说出了COM确实有些难理解。不过,不用担心,本文并不探求多深多高的技术领域,而是带领大家浏览一下我们的COM,就像本文的题目一样:初识COM。 首先,我们先来了解一下有关COM的概念: COM(Component Object Model,组件对象模型)是微软公司的最高级的、包罗万象的二进制通信规范,用于软件组件间跨越多个进程、机器、硬件和操作系统进行互操作。 下面我们来看看COM的一些特点: 在COM中,应用程序不是通过诸如ShowWindow()的API函数进行操纵。程序是由对象组成的,对象向外提供一个或多个接口。接口是一组相关的函数,函数操作他们所属的对象。不能直接访问对象中的数据,而只能通过对象的接口函数访问。学过C++和数据结构的人应该对上述说法并不陌生。 在COM中,没有指向对象的指针这种东西,有的只是指向对象接口的指针。实际上,是指向另一个指针的指针。第二个指针指向一个指针表,表中的指针指向接口成员函数。该指针表称为VTBL。将指针指向对象后,就可以通过调用接口中的成员函数与该对象通信。 如何将指针指向第一个对象呢?可以调用一个返回指向对象指针的COM函数如:CoCreateInstace()。 COM对象都提供一个叫IUnknown的接口,该接口包含方法AddRef()、Release()和QueryInterface()。每个接口都是从IUnknown接口派生出来的。前两个方法操纵一个控制对象使用期限的内部引用计数。当对象第一次被创建时,创建者必须调用该对象的AddRef(),将计数加1。每当其他的用户将一个指针指向该对象时,必须再次调用该对象的AddRef()方法。当用户不再使用对象时,它调用对象的Release()方法,将引用计数减1。当最后一个用户调用对象的Release()方法后,计数值变为0,导致对象释放自己。 下面是AddRef()和Release()方法的简单实现: ULONG IUnknown::AddRef(void) ????{ ?????? m_RefCount++; ?????? return m_RefCount; ????} ULONG IUnknown::Release(void) ????{ ?????? m_RefCount--; ?????? if(m_RefCount==0) ????????{ ?????????? delete this; ?????????? return 0; ????????} ?????? return m_RefCount; ???? } 由于每一个对象都支持IUnknown接口,因此可以通过QueryInterface()来询问对象是否支持您感兴趣的其它接口。接口通过接口ID来标识。 HRESULT IUnknown::QueryInterface(REFIID riid,LPVOID FAR *ppv) ??{ ???? if(riid==IID_IUnknown||riid==IID_IDropTarget) ??????{ ????????*ppv=(LPVOID)this; ???????? AddRef(); ???????? Return S_OK; ??????} ???? else { ???? *ppv=NULL; ???? return E_NOINTERFACE; ??} 用于唯一地区分COM中条目的标识符是一个被称为GUID(全局唯一标识符)或UUID(通用唯一标识符)。 Typedef struct_GUID ????{ ?????? unsigned long Data1; ?????? unsigned short Data2; ?????? unsigned short Data3; ?????? unsigned char Data[8]; ????}GUID; GUID的取值范围非常大,16个字节可能形成的不同组合为3.4ⅹ10^38。 在COM中传输格式化数据的工作是通过数据对象处理的,数据对象是支持IDataObject接口的对象。IDataObject接口支持以下方法: IDataObject::GetData? IDataObject::GetDataHere? IDataObject::QueryGetData IDataObject::GetCanonicalFormatEtc? IDataObject::SetData? IDataObject::EnumFormatEtc

文档评论(0)

liwenhua00 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档