COM动态复合
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);
里面去了吗?死循环了?
说的有点乱,懂的帮忙解释一下了,谢谢