
//QueryInterface的实现
#include<objbase.h>
#include<unknwn.h>
#include<iostream>
usingnamespacestd;
interfaceIX:IUnknown

{
virtualvoid__stdcallFX()=0;
};
interfaceIY:IUnknown

{
virtualvoid__stdcallFY()=0;
};
interfaceIZ:IUnknown

{
virtualvoid__stdcallFZ()=0;
};
externconstIIDIID_IX;
externconstIIDIID_IY;
externconstIIDIID_IZ;
classCA:publicIX,publicIY

{
virtualvoid__stdcallFY()
{cout<<"CA::FY"<<endl;}
virtualvoid__stdcallFX()
{cout<<"CA::FX"<<endl;}
virtualHRESULTSTDMETHODCALLTYPEQueryInterface(
/**//*[in]*/REFIIDriid,
/**//*[iid_is][out]*/void__RPC_FAR*__RPC_FAR*ppvObject)

{
if(riid==IID_IX)

{
*ppvObject=static_cast<IX*>(this);
}
elseif(riid==IID_IY)

{
*ppvObject=static_cast<IY*>(this);
}
elseif(riid==IID_IUnknown)

{
*ppvObject=static_cast<IX*>(this);
}
else

{
*ppvObject=NULL;
returnE_NOINTERFACE;
}
reinterpret_cast<IUnknown*>(*ppvObject)->AddRef();//引用计数加
returnS_OK;
}

virtualULONGSTDMETHODCALLTYPEAddRef(void)
{return0;}

virtualULONGSTDMETHODCALLTYPERelease(void)
{return0;}
};
IUnknown*CreateInstance()

{
IUnknown*pI=static_cast<IX*>(newCA);
pI->AddRef();
returnpI;
}
//{1A5EE493-AD77-4224-9A78-5F2DD3874714}
staticconstIIDIID_IX=

{0x1a5ee493,0xad77,0x4224,
{0x9a,0x78,0x5f,0x2d,0xd3,0x87,0x47,0x14}};
//{AB55D03D-2160-4197-8AD2-36A36E33F69B}
staticconstIIDIID_IY=

{0xab55d03d,0x2160,0x4197,
{0x8a,0xd2,0x36,0xa3,0x6e,0x33,0xf6,0x9b}};
//{5443E124-25A6-451e-A634-2BA392788C38}
staticconstIIDIID_IZ=

{0x5443e124,0x25a6,0x451e,
{0xa6,0x34,0x2b,0xa3,0x92,0x78,0x8c,0x38}};
intmain(intargc,char*argv[])

{
HRESULThr;
IUnknown*pUnknown=CreateInstance();
IX*pIX=NULL;
hr=pUnknown->QueryInterface(IID_IX,(void**)(&pIX));
if(SUCCEEDED(hr))

{
pIX->FX();
}
IY*pIY=NULL;
hr=pUnknown->QueryInterface(IID_IY,(void**)(&pIY));
if(SUCCEEDED(hr))

{
pIY->FY();
}
deletepUnknown;
system("pause");
return0;
}

本文介绍了一个使用C++实现的COM接口QueryInterface的具体案例。通过定义多个接口IX、IY并实现QueryInterface方法,文章展示了如何创建一个多接口支持的对象CA,并通过QueryInterface获取不同接口的实例。
4431

被折叠的 条评论
为什么被折叠?



