《COM技术内幕》笔记(二)

None.gif // AddRef和Release的实现
None.gif
#include < iostream >
None.gif
using namespace std;
None.gif#include
< objbase.h >
None.gif
ExpandedBlockStart.gifContractedBlock.gif
void trace( const char * msg) dot.gif {cout<<msg<<endl;}
None.gif
None.gif
// ForwardreferencesforGUIDs
None.gif
extern const IIDIID_IX;
None.gif
extern const IIDIID_IY;
None.gif
extern const IIDIID_IZ;
None.gif
None.gif
// Interfaces
None.gif
interface IX:IUnknown
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
virtualvoid__stdcallFx()=0;
ExpandedBlockEnd.gif}
;
None.gif
None.gif
interface IY:IUnknown
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
virtualvoid__stdcallFy()=0;
ExpandedBlockEnd.gif}
;
None.gif
None.gif
interface IZ:IUnknown
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
virtualvoid__stdcallFz()=0;
ExpandedBlockEnd.gif}
;
None.gif
None.gif
None.gif
//
None.gif
// Component
None.gif
//
None.gif
class CA: public IX,
None.gif
public IY
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
//IUnknownimplementation
InBlock.gif
virtualHRESULT__stdcallQueryInterface(constIID&iid,void**ppv);
InBlock.gif
virtualULONG__stdcallAddRef();
InBlock.gif
virtualULONG__stdcallRelease();
InBlock.gif
InBlock.gif
//InterfaceIXimplementation
ExpandedSubBlockStart.gifContractedSubBlock.gif
virtualvoid__stdcallFx()dot.gif{cout<<"Fx"<<endl;}
InBlock.gif
InBlock.gif
//InterfaceIYimplementation
ExpandedSubBlockStart.gifContractedSubBlock.gif
virtualvoid__stdcallFy()dot.gif{cout<<"Fy"<<endl;}
InBlock.gif
InBlock.gif
public:
InBlock.gif
//Constructor
ExpandedSubBlockStart.gifContractedSubBlock.gif
CA():m_cRef(0)dot.gif{}
InBlock.gif
InBlock.gif
//Destructor
ExpandedSubBlockStart.gifContractedSubBlock.gif
~CA()dot.gif{trace("CA:Destroyself.");}
InBlock.gif
InBlock.gif
private:
InBlock.gif
longm_cRef;
ExpandedBlockEnd.gif}
;
None.gif
None.gifHRESULT__stdcallCA::QueryInterface(
const IID & iid, void ** ppv)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
if(iid==IID_IUnknown)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.giftrace(
"CAQI:ReturnpointertoIUnknown.");
InBlock.gif
*ppv=static_cast<IX*>(this);
ExpandedSubBlockEnd.gif}

InBlock.gif
elseif(iid==IID_IX)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.giftrace(
"CAQI:ReturnpointertoIX.");
InBlock.gif
*ppv=static_cast<IX*>(this);
ExpandedSubBlockEnd.gif}

InBlock.gif
elseif(iid==IID_IY)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.giftrace(
"CAQI:ReturnpointertoIY.");
InBlock.gif
*ppv=static_cast<IY*>(this);
ExpandedSubBlockEnd.gif}

InBlock.gif
else
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.giftrace(
"CAQI:Interfacenotsupported.");
InBlock.gif
*ppv=NULL;
InBlock.gif
returnE_NOINTERFACE;
ExpandedSubBlockEnd.gif}

InBlock.gifreinterpret_cast
<IUnknown*>(*ppv)->AddRef();
InBlock.gif
returnS_OK;
ExpandedBlockEnd.gif}

None.gif
None.gifULONG__stdcallCA::AddRef()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gifcout
<<"CA:AddRef="<<m_cRef+1<<'.'<<endl;
InBlock.gif
returnInterlockedIncrement(&m_cRef);
ExpandedBlockEnd.gif}

None.gif
None.gifULONG__stdcallCA::Release()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gifcout
<<"CA:Release="<<m_cRef-1<<'.'<<endl;
InBlock.gif
InBlock.gif
if(InterlockedDecrement(&m_cRef)==0)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifdelete
this;
InBlock.gif
return0;
ExpandedSubBlockEnd.gif}

InBlock.gif
returnm_cRef;
ExpandedBlockEnd.gif}

None.gif
None.gif
//
None.gif
// Creationfunction
None.gif
//
None.gif
IUnknown * CreateInstance()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gifIUnknown
*pI=static_cast<IX*>(newCA);
InBlock.gifpI
->AddRef();
InBlock.gif
returnpI;
ExpandedBlockEnd.gif}

None.gif
None.gif
//
None.gif
// IIDs
None.gif
//
None.gif
// {32bb8320-b41b-11cf-a6bb-0080c7b2d682}
None.gif
static const IIDIID_IX =
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {0x32bb8320,0xb41b,0x11cf,
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{0xa6,0xbb,0x0,0x80,0xc7,0xb2,0xd6,0x82}}
;
None.gif
None.gif
// {32bb8321-b41b-11cf-a6bb-0080c7b2d682}
None.gif
static const IIDIID_IY =
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {0x32bb8321,0xb41b,0x11cf,
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{0xa6,0xbb,0x0,0x80,0xc7,0xb2,0xd6,0x82}}
;
None.gif
None.gif
// {32bb8322-b41b-11cf-a6bb-0080c7b2d682}
None.gif
static const IIDIID_IZ =
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {0x32bb8322,0xb41b,0x11cf,
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{0xa6,0xbb,0x0,0x80,0xc7,0xb2,0xd6,0x82}}
;
None.gif
None.gif
//
None.gif
// Client
None.gif
//
None.gif
int main()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gifHRESULThr;
InBlock.gif
InBlock.giftrace(
"Client:GetanIUnknownpointer.");
InBlock.gifIUnknown
*pIUnknown=CreateInstance();
InBlock.gif
InBlock.gif
InBlock.giftrace(
"Client:GetinterfaceIX.");
InBlock.gif
InBlock.gifIX
*pIX=NULL;
InBlock.gifhr
=pIUnknown->QueryInterface(IID_IX,(void**)&pIX);
InBlock.gif
InBlock.gif
if(SUCCEEDED(hr))
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.giftrace(
"Client:SucceededgettingIX.");
InBlock.gifpIX
->Fx();//UseinterfaceIX.
InBlock.gif
pIX->Release();
ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
InBlock.giftrace(
"Client:GetinterfaceIY.");
InBlock.gif
InBlock.gifIY
*pIY=NULL;
InBlock.gifhr
=pIUnknown->QueryInterface(IID_IY,(void**)&pIY);
InBlock.gif
if(SUCCEEDED(hr))
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.giftrace(
"Client:SucceededgettingIY.");
InBlock.gifpIY
->Fy();//UseinterfaceIY.
InBlock.gif
pIY->Release();
ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
InBlock.giftrace(
"Client:Askforanunsupportedinterface.");
InBlock.gif
InBlock.gifIZ
*pIZ=NULL;
InBlock.gifhr
=pIUnknown->QueryInterface(IID_IZ,(void**)&pIZ);
InBlock.gif
if(SUCCEEDED(hr))
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.giftrace(
"Client:SucceededingettinginterfaceIZ.");
InBlock.gifpIZ
->Fz();
InBlock.gifpIZ
->Release();
ExpandedSubBlockEnd.gif}

InBlock.gif
else
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.giftrace(
"Client:CouldnotgetinterfaceIZ.");
ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
InBlock.giftrace(
"Client:ReleaseIUnknowninterface.");
InBlock.gifpIUnknown
->Release();
InBlock.gifsystem(
"pause");
InBlock.gif
return0;
ExpandedBlockEnd.gif}

None.gif
None.gif
None.gif
None.gif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值