QueryInterface函数的实现如下:HRESULT COMB::QueryInterface(const IID& iid, void **ppv)
{
if ( iid == IID_IUnknown )
{
*ppv = (IUnknown *) this ;  //此处已经把*ppv做(IUnknown *)强制转换
((IUnknown *)(*ppv))->AddRef() ;//为什么还要再把*ppv强制转换一次
} else if ( iid == IID_OtherInterface ) 
{
*ppv = (IOtherInterface *) this ;
((IOtherInterface *)(*ppv))->AddRef() ;
} else if ( iid == IID_SomeInterface ) 
{
return m_pUnknownInner->QueryInterface(iid, ppv) ;
} else 
{
*ppv = NULL;
return E_NOINTERFACE ;
}
return S_OK;
}

解决方案 »

  1.   

    ppv的类型其实是void *,直接ppv->AddRef()应该是会出错的
      

  2.   

    楼上的说的正确,主要是为了函数调用。但是你的实现有问题。因为每个接口都是从IUnknown继承的,所以直接将this指针强制转换为IUnknown,存在二义性,就是有两个IUnknown基类,所以正确的做法应该是将this指针强制转换为IOtherInterface再转换为IUnknown或者就转化为IOtherInterface即可!一般不会有人直接使用IUnknown指针的。详细的说明参考《COM原理和应用》P45的说明。