// QueryInterface的实现
#include < objbase.h >
#include < unknwn.h >
#include < iostream >
using namespace std;
interface IX:IUnknown
{
virtualvoid__stdcallFX()=0;
} ;
interface IY:IUnknown
{
virtualvoid__stdcallFY()=0;
} ;
interface IZ:IUnknown
{
virtualvoid__stdcallFZ()=0;
} ;
extern const IIDIID_IX;
extern const IIDIID_IY;
extern const IIDIID_IZ;
class CA: public IX, public IY
{
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}
static const IIDIID_IX =
{0x1a5ee493,0xad77,0x4224,{0x9a,0x78,0x5f,0x2d,0xd3,0x87,0x47,0x14}} ;
// {AB55D03D-2160-4197-8AD2-36A36E33F69B}
static const IIDIID_IY =
{0xab55d03d,0x2160,0x4197,{0x8a,0xd2,0x36,0xa3,0x6e,0x33,0xf6,0x9b}} ;
// {5443E124-25A6-451e-A634-2BA392788C38}
static const IIDIID_IZ =
{0x5443e124,0x25a6,0x451e,{0xa6,0x34,0x2b,0xa3,0x92,0x78,0x8c,0x38}} ;
int main( int argc, 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;
}