COM初学者看看,有助于理解
来源:互联网 发布:vb 安装包修改 编辑:程序博客网 时间:2024/05/01 13:21
//采用多重继承方式,模拟实现COM接口和COM对象的例子#define IID_IUnknown 1#define IID_IVideo 2#define IID_IAudio 3struct IUnknown {virtual BOOL QueryInterface(int nIid, void **ppvObj)=0;virtual DWORD Release()=0;virtual DWORD AddRef()=0;};class IVideo:virtual public IUnknown //接口类定义{public:virtual BOOL OpenVideoChannel()=0;virtual BOOL CloseVideoChannel()=0;virtual DWORD GetVideoChannelState()=0;};class IAudio:virtual public IUnknown //接口类定义{virtual BOOL OpenAudioChannel()=0;virtual BOOL CloseAudioChannel()=0;virtual void TransferAudio()=0;virtual DWORD GetAudioChannelState()=0;};class CVisiblePhone:public IAudio,public IVideo //COM对象类定义{public:CVisiblePhone();~CVisiblePhone();public://IUnknown memeber functionHRESULT QueryInterface(int nIid, void **ppvObj);DWORD Release();DWORD AddRef();//IVudio memeber functionBOOL OpenVideoChannel();BOOL CloseVideoChannel();DWORD GetVideoChannelState();//IAideo memeber functionBOOL OpenAudioChannel();BOOL CloseAudioChannel();void TransferAudio();DWORD GetAudioChannelState();private:DWORD m_Ref;};//实现接口查询函数QueryInterface()HRESULT CVisiblePhone::QueryInterface(int iid,void **ppvObj){if (iid==IID_IUnknown){*ppvObj=(IUnknown *)((IVideo *)this);((IUnknown *)*ppvObj)->AddRef();}else if (iid==IID_IVideo){*ppvObj=(IVideo *)this;((IVideo *)*ppvObj)->AddRef();}else if (iid==IID_IAudio){*ppvObj=(IAudio *)this;((IAudio *)*ppvObj)->AddRef();}else{*ppvObj=NULL;return E_NOINTERFACE;}return S_OK;}
//采用内嵌类的方式在一个COM对象中实现多个接口#define IID_IUnknown 1#define IID_IVideo 2#define IID_IAudio 3class CVisiblePhone//COM对象类定义{public:CVisiblePhone();~CVisiblePhone();public://IUnknown memeber functionHRESULT QueryInterface(int nIid, void **ppvObj);DWORD Release();DWORD AddRef();//embeded IAudioclass CAudioObj:public IAudio{//IUnknown memeber functionHRESULT QueryInterface(int nIid, void **ppvObj);DWORD Release();DWORD AddRef();//IAideo memeber functionBOOL OpenAudioChannel();BOOL CloseAudioChannel();void TransferAudio();DWORD GetAudioChannelState();}m_AudioObj;//embeded IVudioclass CVideoObj:public IVideo{//IUnknown memeber functionHRESULT QueryInterface(int nIid, void **ppvObj);DWORD Release();DWORD AddRef();//IVudio memeber functionBOOL OpenVideoChannel();BOOL CloseVideoChannel();DWORD GetVideoChannelState();}m_VideoObj;private:DWORD m_Ref;};//实现接口查询函数QueryInterface()HRESULT CVisiblePhone::QueryInterface(int iid,void **ppvObj){if (iid==IID_IUnknown){*ppvObj=(IUnknown *)&m_VideoObj;AddRef();}else if (iid==IID_IVideo){*ppvObj=&m_VideoObj;AddRef();}else if (iid==IID_IAudio){*ppvObj=&m_AudioObj;AddRef();}else{*ppvObj=NULL;return E_NOINTERFACE;}return S_OK;}
- COM初学者看看,有助于理解
- 初学者应该看看
- java初学者看看
- cocos2d初学者可以看看
- 反向投影(有助于理解camshift)
- Hadoop实战实例(有助于理解概念)
- View Controller容器(有助于理解addChildViewController)
- 有助于理解频域、时域的几张图
- 初学Linux内核模块及各种总结(有助于初学者使用)
- Java初学者看看(转载)
- 理解RSA算法原理,将有助于理解计算机
- COM初学者必看
- 这有一个很好的例子,有助于理解事件机制。
- 有助于理解C语言一些函数的面试题
- 有助于对android的Activity生命周期的理解的例子
- 这有一个很好的例子,有助于理解事件机制。
- Nova几个简单的概念--有助于OpenStack的源码理解
- 小小捣鼓一下手机和电脑---有助于理解NAT
- 二分查找的非递归程序(折半查找)
- 10进制数转换为二进制
- 第一卷清晨的帝国 第一百四十八章 一夜无言观山景
- SQL Server 2008可视化设置键唯一
- oracle学习笔记(一)之逻辑结构和连接
- COM初学者看看,有助于理解
- 关于薪资做个问卷,希望大家老实回答
- :+,-,*,/,% 运算,直到输入一个正确的运算符
- 冒泡排序--(原理和自己的例子)
- explicit简介
- 现代C++风格的新元素
- TR1和Boost简介
- QQ在线状态
- 《Java编程思想》学习笔记14——I/O高级