大家好,又见面了,我是你们的朋友全栈君。
一,QueryInterface函数 原型:
HRESULT __stdcall QueryInterface(const IID&iid,void **ppv);
iid:标志客户所需的接口。是”一个接口标志符“结构(IID)。 ppv:QueryInterface用来存放所请求接口的地址。
返回值:可以返回S_OK 或 E_NOINTERFACE应该用SUCEEDED或者FAILED宏验证是否成功。
使用方法:
假如知道一个指向IUnknown接口的指针pI,传给它一个接口标志符即可
例如:
void
Foo(IUnknown
*
pI)
QueryInterface函数有关QueryInterface函数
{
QueryInterface函数 IX * pIX = NULL;
QueryInterface函数
QueryInterface函数 HRESULT hr = pI->QueryInterface(IID_IX,(void **)pIX);
QueryInterface函数
QueryInterface函数 if(SUCCEEDED(hr))
QueryInterface函数有关QueryInterface函数 {
QueryInterface函数 pIX->FX();
QueryInterface函数 }
QueryInterface函数}
QueryInterface函数
QueryInterface函数
//
QueryInterface的实现。
QueryInterface函数
QueryInterface函数HRESULT _stdcall CA::QueryInterface(
const
IID
&
iid,
void
**
ppv)
QueryInterface函数有关QueryInterface函数
{
QueryInterface函数 if(iid == IID_IUnknown)
QueryInterface函数有关QueryInterface函数 {
QueryInterface函数 *ppv = static_cast<IX *>(this);
QueryInterface函数 }
QueryInterface函数 else if(iid == IID_IX)
QueryInterface函数有关QueryInterface函数 {
QueryInterface函数 *ppv = static_cast<IX *>(this);
QueryInterface函数 }
QueryInterface函数 else if(iid == IID_IY)
QueryInterface函数有关QueryInterface函数 {
QueryInterface函数 *ppv = static_cast<IY *>(this);
QueryInterface函数 }
QueryInterface函数 else if(iid == IID_IUnknown)
QueryInterface函数有关QueryInterface函数 {
QueryInterface函数 *ppv = NULL;
QueryInterface函数 return E_NOINTERFACE;
QueryInterface函数 }
QueryInterface函数
QueryInterface函数 static_cast <IUnknown *> (* ppv)->AddRef();
QueryInterface函数 retru S_OK;
QueryInterface函数
QueryInterface函数}
多重继承及类型转换。
通常将一种类型的指针转换为另一种类型并不会改变它的值。为了支持多重继承,某些情况下,C++必须改变类指针的值。
假如一个类定义如下:
class CA: public IX,public IY{…};
由于CA同时继承了IX,IY因此可以使用IX或IY指针的地方均可以使用指向CA的指针。
QueryInterface函数
void
foo(IX
*
pIX);
QueryInterface函数
void
bar(IY
*
pIY);
QueryInterface函数
int
main()
QueryInterface函数有关QueryInterface函数
{
QueryInterface函数 CA* pA = new CA;
QueryInterface函数 foo(pA);
QueryInterface函数 bar(pA);
QueryInterface函数 delete pA;
QueryInterface函数 return 0;
QueryInterface函数}
QueryInterface函数
foo需要一个指向合法的IX的虚拟函数表的指针; bar需要一个指向合法的IY的虚拟函数表的指针; 当然IX和IY的虚拟函数表的内容是不一样的。因此将一个IX vtbl传给bar时,此函数是不能正常工作的。 因此编译器将同一指针传给foo和bar是不可能的,它必须对CA的指针进行修改以便他指向一个合适的vtbl指针。 下图显示了CA对象的内存结构。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/151157.html原文链接:https://javaforall.cn