有关QueryInterface函数

发布时间:2025-12-09 13:46:26 浏览次数:3

一,QueryInterface函数
原型:

HRESULT __stdcallQueryInterface(constIID&iid,void **ppv);

iid:标志客户所需的接口。是”一个接口标志符“结构(IID)。
ppv:QueryInterface用来存放所请求接口的地址。

返回值:可以返回S_OK 或 E_NOINTERFACE应该用SUCEEDED或者FAILED宏验证是否成功。

使用方法:

假如知道一个指向IUnknown接口的指针pI,传给它一个接口标志符即可

例如:


void
Foo(IUnknown
*
pI)


{

IX*pIX=NULL;

HRESULThr=pI->QueryInterface(IID_IX,(void**)pIX);

if(SUCCEEDED(hr))
{

pIX->FX();
}
}



//
QueryInterface的实现。



HRESULT_stdcallCA::QueryInterface(
const
IID
&
iid,
void

**
ppv)


{

if(iid==IID_IUnknown)
{

*ppv=static_cast<IX*>(this);
}
elseif(iid==IID_IX)
{

*ppv=static_cast<IX*>(this);
}
elseif(iid==IID_IY)
{

*ppv=static_cast<IY*>(this);
}
elseif(iid==IID_IUnknown)
{

*ppv=NULL;
returnE_NOINTERFACE;
}

static_cast<IUnknown*>(*ppv)->AddRef();
retruS_OK;

}

多重继承及类型转换。

通常将一种类型的指针转换为另一种类型并不会改变它的值。为了支持多重继承,某些情况下,C++必须改变类指针的值。
假如一个类定义如下:

class CA: public IX,public IY{…};

由于CA同时继承了IX,IY因此可以使用IX或IY指针的地方均可以使用指向CA的指针。


void
foo(IX
*
pIX);

void
bar(IY
*
pIY);

int
main()


{

CA*pA=newCA;
foo(pA);
bar(pA);
deletepA;
return0;
}


foo需要一个指向合法的IX的虚拟函数表的指针;
bar需要一个指向合法的IY的虚拟函数表的指针;
当然IX和IY的虚拟函数表的内容是不一样的。因此将一个IX vtbl传给bar时,此函数是不能正常工作的。
因此编译器将同一指针传给foo和bar是不可能的,它必须对CA的指针进行修改以便他指向一个合适的vtbl指针。
下图显示了CA对象的内存结构。

需要做网站?需要网络推广?欢迎咨询客户经理 13272073477