关于接口指针转换的实现的疑问

ftkghost 2006-06-08 10:56:23
问题在代码中注释处:

class IUnknown{
public:
virtual long AddRef()=0;
virtual long Release()=0;
virtual HRESULT QueryInterface(const IID& iid, void **ppv)=0;
};
class IA:public IUnknown{
public:
virtual void funcA()=0;
};
class IB:public IUnknown{
public:
virtual void funcB()=0;
};

class MyCoClass: public IA, public IB{
private:
long m_nRef;
public:
MyCoClass(){m_nRef=0}
~MyCoClass(){}
long AddRef();
long Release();
HRESULT QueryInterface(const IID& iid, void **ppv);
void funcA(){}
void funcB(){}
};

long MyCoClass::AddRef()
{
m_nRef++;
return m_nRef;
}

long MyCoClass::Release()
{
m_nRef--;
if( 0 == m_nRef ){
delete this;
return 0;
}
return m_nRef;
}

HRESULT MyCoClass::QueryInterface(const IID& iid, void **ppv)
{
if( IID_IUnknown == iid){
*ppv = (IUnknown*)this;
(*IUnknown)(*ppv)->AddRef();
}
else if( IID_IA == iid ){
*ppv = (IA*)this; //请问这里的转换是怎么实现的
(*IA)(*ppv)->AddRef();
}
else if( IID_IB == iid ){
*ppv = (IB*)this; //请问这里的转换是怎么实现的
(*IB)(*ppv)->AddRef();
}
else{
*ppv = NULL;
return E_NOINTERFACE;
}
return S_OK;
}

我还有两个贴,希望大家帮忙看看 谢谢
http://community.csdn.net/Expert/topic/4810/4810321.xml?temp=.5512506
http://community.csdn.net/Expert/topic/4810/4810348.xml?temp=.4504206

...全文
125 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
test422 2006-06-09
  • 打赏
  • 举报
回复
强制类型转换。就是这么简单。
因为一个组件实现多个接口时,你的IA,IB,你可以说这个组件是IA,也可以说是IB。
因为对于IA或者IB来说,都是统一在VTable的表中排列方法的指针。
你还是多看看有关COM的书吧。
否则东一句,西一句的,可能进步很慢。
ftkghost 2006-06-09
  • 打赏
  • 举报
回复
例子中的ID是我自己用来说明的,不是实际的,一个符号而已。
其中class IA,class IB 表示接口A,B

GUID Global Unique Identifiers,是一个128位随机整数,可以自己指定(自己指定由可能造成出错),也可以通过工具生成,由COM库和工具(如GUIDGen.exe)生成的GUID只是在概率上唯一,而不是绝对的
IID是唯一标识接口的GUID
CLSID是唯一标识COM类的GUID
ProgID是一个字符串,也唯一标识一个组件
它们都存储在注册表中,使用COM库函数查找
lxpws 2006-06-09
  • 打赏
  • 举报
回复
<<inside the c++ object model>>
sunmz_wjxy 2006-06-09
  • 打赏
  • 举报
回复
我想问一个问题:
为什么class IA的IID是IID_IA
class IA的IID是IID_IB
如果在ATL中,一个COM对象的接口的IID如何取得?
还有什么是GUID,和IID,CLSID有什么区别,都从那里获得?
ftkghost 2006-06-09
  • 打赏
  • 举报
回复
谢谢 我就是在看潘爱民那本《COM原理与应用》时留下的疑问,这个问题问得很傻,主要是看借口查询太多了,总觉得这里的强制类型转换又进行接口查询...
flyleaf0206 2006-06-09
  • 打赏
  • 举报
回复
在做转换时,实际上是将this指针加上了目标类型与类类型之间的vtable的偏移量
handsomerun 2006-06-09
  • 打赏
  • 举报
回复
对,强制转换
把基类指针指向派生类。类似于这样的转换

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧