- 1、本文档共29页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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::QueryGetDataIDataObject::GetCanonicalFormatEtc?IDataObject::SetData?IDataObject::EnumFormatEtc
您可能关注的文档
最近下载
- 2024-2025学年山东省德州市小升初英语试题与参考答案.pdf VIP
- 某县纪委监委班子年度民主生活会对照检查材料.docx VIP
- 燃烧仿真.燃烧化学动力学:反应路径分析:燃烧仿真软件操作与实践.pdf VIP
- 燃烧仿真.燃烧化学动力学:反应路径分析:燃烧仿真基础理论.pdf VIP
- 木栈道及木平台施工方案.docx VIP
- 上海市徐汇区2024届高三年级一模考试物理试卷(附答案).pdf
- 燃烧仿真.燃烧化学动力学:反应路径分析:燃烧仿真结果的统计与分析.pdf VIP
- 外研版英语七年级上册单词默写打印版.pdf VIP
- 燃烧仿真.燃烧化学动力学:化学反应机理:燃烧仿真中的边界条件设置.pdf VIP
- 燃烧仿真.燃烧化学动力学:反应路径分析:高级燃烧化学动力学理论.pdf VIP
文档评论(0)