//AddRef和Release的实现#include<iostream>usingnamespacestd;#include<objbase.h>voidtrace(constchar*msg){cout<<msg<<endl;}//ForwardreferencesforGUIDsexternconstIIDIID_IX;externconstIIDIID_IY;externconstIIDIID_IZ;//InterfacesinterfaceIX:IUnknown{virtualvoid__stdcallFx()=0;};interfaceIY:IUnknown{virtualvoid__stdcallFy()=0;};interfaceIZ:IUnknown{virtualvoid__stdcallFz()=0;};////Component//classCA:publicIX,publicIY{//IUnknownimplementationvirtualHRESULT__stdcallQueryInterface(constIID&iid,void**ppv);virtualULONG__stdcallAddRef();virtualULONG__stdcallRelease();//InterfaceIXimplementationvirtualvoid__stdcallFx(){cout<<"Fx"<<endl;}//InterfaceIYimplementationvirtualvoid__stdcallFy(){cout<<"Fy"<<endl;}public://ConstructorCA():m_cRef(0){}//Destructor~CA(){trace("CA:Destroyself.");}private:longm_cRef;};HRESULT__stdcallCA::QueryInterface(constIID&iid,void**ppv){if(iid==IID_IUnknown){trace("CAQI:ReturnpointertoIUnknown.");*ppv=static_cast<IX*>(this);}elseif(iid==IID_IX){trace("CAQI:ReturnpointertoIX.");*ppv=static_cast<IX*>(this);}elseif(iid==IID_IY){trace("CAQI:ReturnpointertoIY.");*ppv=static_cast<IY*>(this);}else{trace("CAQI:Interfacenotsupported.");*ppv=NULL;returnE_NOINTERFACE;}reinterpret_cast<IUnknown*>(*ppv)->AddRef();returnS_OK;}ULONG__stdcallCA::AddRef(){cout<<"CA:AddRef="<<m_cRef+1<<'.'<<endl;returnInterlockedIncrement(&m_cRef);}ULONG__stdcallCA::Release(){cout<<"CA:Release="<<m_cRef-1<<'.'<<endl;if(InterlockedDecrement(&m_cRef)==0){deletethis;return0;}returnm_cRef;}////Creationfunction//IUnknown*CreateInstance(){IUnknown*pI=static_cast<IX*>(newCA);pI->AddRef();returnpI;}////IIDs////{32bb8320-b41b-11cf-a6bb-0080c7b2d682}staticconstIIDIID_IX={0x32bb8320,0xb41b,0x11cf,{0xa6,0xbb,0x0,0x80,0xc7,0xb2,0xd6,0x82}};//{32bb8321-b41b-11cf-a6bb-0080c7b2d682}staticconstIIDIID_IY={0x32bb8321,0xb41b,0x11cf,{0xa6,0xbb,0x0,0x80,0xc7,0xb2,0xd6,0x82}};//{32bb8322-b41b-11cf-a6bb-0080c7b2d682}staticconstIIDIID_IZ={0x32bb8322,0xb41b,0x11cf,{0xa6,0xbb,0x0,0x80,0xc7,0xb2,0xd6,0x82}};////Client//intmain(){HRESULThr;trace("Client:GetanIUnknownpointer.");IUnknown*pIUnknown=CreateInstance();trace("Client:GetinterfaceIX.");IX*pIX=NULL;hr=pIUnknown->QueryInterface(IID_IX,(void**)&pIX);if(SUCCEEDED(hr)){trace("Client:SucceededgettingIX.");pIX->Fx();//UseinterfaceIX.pIX->Release();}trace("Client:GetinterfaceIY.");IY*pIY=NULL;hr=pIUnknown->QueryInterface(IID_IY,(void**)&pIY);if(SUCCEEDED(hr)){trace("Client:SucceededgettingIY.");pIY->Fy();//UseinterfaceIY.pIY->Release();}trace("Client:Askforanunsupportedinterface.");IZ*pIZ=NULL;hr=pIUnknown->QueryInterface(IID_IZ,(void**)&pIZ);if(SUCCEEDED(hr)){trace("Client:SucceededingettinginterfaceIZ.");pIZ->Fz();pIZ->Release();}else{trace("Client:CouldnotgetinterfaceIZ.");}trace("Client:ReleaseIUnknowninterface.");pIUnknown->Release();system("pause");return0;}