COM动态复合

mengde007 2010-07-18 10:25:13
4.9节“动态复合”

(1).首先:
STDMETHODMIP GenericVehicle::XTrunck::QueryInterface(REFIID riid, void** ppv)
{
if(riid != IID_ITruck)
return This()-> QueryInterface(riid, ppv);

**ppv = static_cast <ITrunck*> (*ppv)-> AddRef();
return S_OK;
}

(2).STDMETHODMIP GenericVehicle::QueryInterface(REFIID ridd, void** ppv)
{
...
else if(riid == IID_ITruck)
{
if(m_pTearOff == 0)
m_pTearOff = new XTruck(this);
if(m_pTearOff)
return m_pTearOff-> QueryInterface(riid, ppv);
else
return (*ppv = 0), E_NOINTERFACE;
}
esle if(riid == IID_IMonsterTruck)
{ // 与上面类似 }
...
}

(3).假如第一次成功执行:
ITruck* pITruck;
this-> QueryInterface(IID_ITruck, (void**)&pITruck),于是m_pTearOff = new XTruck(this);

(4).然后执行
IMonsterTruck* pIMonsterTruck;
pITruck-> QueryInterface(IID_IMonsterTruck, (void**)&pIMonsterTruck);
这相当于执行了(1)里面的return This()-> QueryInterface(riid, ppv);
然后又执行了(2)里面的
m_pTearOff-> QueryInterface(riid, ppv);
这时,m_pTearOff是原来的那个new XTruck(this);
那不是又回到了pITruck-> QueryInterface(IID_IMonsterTruck, (void**)&pIMonsterTruck);
里面去了吗?死循环了?

说的有点乱,懂的帮忙解释一下了,谢谢
...全文
65 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
mengde007 2010-07-19
  • 打赏
  • 举报
回复
自己解决了;谢谢诸位。
lxl843 2010-07-18
  • 打赏
  • 举报
回复
我以前问过类似的问题,你可以参考下
http://topic.csdn.net/u/20090507/11/50087d8d-7368-463f-b87f-299bca038517.html

3,245

社区成员

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

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