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

None.gif
None.gif
// QueryInterface的实现
None.gif

None.gif#include
< objbase.h >
None.gif#include
< unknwn.h >
None.gif#include
< iostream >
None.gif
using namespace std;
None.gif
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
extern const IIDIID_IX;
None.gif
extern const IIDIID_IY;
None.gif
extern const IIDIID_IZ;
None.gif
None.gif
class CA: public IX, public IY
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
ExpandedSubBlockStart.gifContractedSubBlock.gif
virtualvoid__stdcallFY()dot.gif{cout<<"CA::FY"<<endl;}
ExpandedSubBlockStart.gifContractedSubBlock.gif
virtualvoid__stdcallFX()dot.gif{cout<<"CA::FX"<<endl;}
InBlock.gif
virtualHRESULTSTDMETHODCALLTYPEQueryInterface(
ExpandedSubBlockStart.gifContractedSubBlock.gif
/**//*[in]*/REFIIDriid,
ExpandedSubBlockStart.gifContractedSubBlock.gif
/**//*[iid_is][out]*/void__RPC_FAR*__RPC_FAR*ppvObject)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
if(riid==IID_IX)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
*ppvObject=static_cast<IX*>(this);
ExpandedSubBlockEnd.gif}

InBlock.gif
elseif(riid==IID_IY)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
*ppvObject=static_cast<IY*>(this);
ExpandedSubBlockEnd.gif}

InBlock.gif
elseif(riid==IID_IUnknown)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
*ppvObject=static_cast<IX*>(this);
ExpandedSubBlockEnd.gif}

InBlock.gif
else
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
*ppvObject=NULL;
InBlock.gif
returnE_NOINTERFACE;
ExpandedSubBlockEnd.gif}

InBlock.gifreinterpret_cast
<IUnknown*>(*ppvObject)->AddRef();//引用计数加
InBlock.gif
returnS_OK;
InBlock.gif
ExpandedSubBlockEnd.gif}

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif
virtualULONGSTDMETHODCALLTYPEAddRef(void)dot.gif{return0;}
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif
virtualULONGSTDMETHODCALLTYPERelease(void)dot.gif{return0;}
InBlock.gif
ExpandedBlockEnd.gif}
;
None.gif
None.gifIUnknown
* 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
// {1A5EE493-AD77-4224-9A78-5F2DD3874714}
None.gif
static const IIDIID_IX =
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {0x1a5ee493,0xad77,0x4224,dot.gif{0x9a,0x78,0x5f,0x2d,0xd3,0x87,0x47,0x14}} ;
None.gif
None.gif
// {AB55D03D-2160-4197-8AD2-36A36E33F69B}
None.gif
static const IIDIID_IY =
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {0xab55d03d,0x2160,0x4197,dot.gif{0x8a,0xd2,0x36,0xa3,0x6e,0x33,0xf6,0x9b}} ;
None.gif
None.gif
// {5443E124-25A6-451e-A634-2BA392788C38}
None.gif
static const IIDIID_IZ =
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {0x5443e124,0x25a6,0x451e,dot.gif{0xa6,0x34,0x2b,0xa3,0x92,0x78,0x8c,0x38}} ;
None.gif
None.gif
int main( int argc, char * argv[])
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gifHRESULThr;
InBlock.gifIUnknown
*pUnknown=CreateInstance();
InBlock.gifIX
*pIX=NULL;
InBlock.gifhr
=pUnknown->QueryInterface(IID_IX,(void**)(&pIX));
InBlock.gif
if(SUCCEEDED(hr))
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifpIX
->FX();
ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gifIY
*pIY=NULL;
InBlock.gifhr
=pUnknown->QueryInterface(IID_IY,(void**)(&pIY));
InBlock.gif
if(SUCCEEDED(hr))
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifpIY
->FY();
ExpandedSubBlockEnd.gif}

InBlock.gifdeletepUnknown;
InBlock.gifsystem(
"pause");
InBlock.gif
return0;
ExpandedBlockEnd.gif}

None.gif
None.gif
None.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值