//AddRef和Release的实现
#include<iostream>
usingnamespacestd;
#include<objbase.h>

voidtrace(constchar*msg)
{cout<<msg<<endl;}
//ForwardreferencesforGUIDs
externconstIIDIID_IX;
externconstIIDIID_IY;
externconstIIDIID_IZ;
//Interfaces
interfaceIX:IUnknown

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

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

{
virtualvoid__stdcallFz()=0;
};

//
//Component
//
classCA:publicIX,
publicIY

{
//IUnknownimplementation
virtualHRESULT__stdcallQueryInterface(constIID&iid,void**ppv);
virtualULONG__stdcallAddRef();
virtualULONG__stdcallRelease();
//InterfaceIXimplementation
virtualvoid__stdcallFx()
{cout<<"Fx"<<endl;}
//InterfaceIYimplementation
virtualvoid__stdcallFy()
{cout<<"Fy"<<endl;}
public:
//Constructor
CA():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;
}


本文介绍了一个COM组件中AddRef和Release方法的具体实现细节,包括如何增加引用计数及释放对象,展示了如何通过QueryInterface获取不同接口并使用这些接口。
494

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



