// AddRef和Release的实现 #include < iostream > using namespace std;#include < objbase.h > void trace( const char * msg) {cout<<msg<<endl;} // ForwardreferencesforGUIDs extern const IIDIID_IX; extern const IIDIID_IY; extern const IIDIID_IZ; // Interfaces interface IX:IUnknown {virtualvoid__stdcallFx()=0;} ; interface IY:IUnknown {virtualvoid__stdcallFy()=0;} ; interface IZ:IUnknown {virtualvoid__stdcallFz()=0;} ; // // Component // class CA: public IX, public IY {//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( const IID & 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} static const IIDIID_IX = {0x32bb8320,0xb41b,0x11cf,{0xa6,0xbb,0x0,0x80,0xc7,0xb2,0xd6,0x82}} ; // {32bb8321-b41b-11cf-a6bb-0080c7b2d682} static const IIDIID_IY = {0x32bb8321,0xb41b,0x11cf,{0xa6,0xbb,0x0,0x80,0xc7,0xb2,0xd6,0x82}} ; // {32bb8322-b41b-11cf-a6bb-0080c7b2d682} static const IIDIID_IZ = {0x32bb8322,0xb41b,0x11cf,{0xa6,0xbb,0x0,0x80,0xc7,0xb2,0xd6,0x82}} ; // // Client // int main() {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;}