// 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;}