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

本文介绍了一个C++示例,展示了如何实现COM接口QueryInterface方法。通过一个具体类CA同时继承IX和IY接口,并实现其QueryInterface方法来响应不同的接口请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 
virtual void __stdcall FX() = 0;
ExpandedBlockEnd.gif}
;
None.gif
None.gif
interface IY:IUnknown
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif 
virtual void __stdcall FY() = 0;
ExpandedBlockEnd.gif}
;
None.gif
None.gif
interface IZ:IUnknown
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif 
virtual void __stdcall FZ() = 0;
ExpandedBlockEnd.gif}
;
None.gif
None.gif
extern const IID IID_IX;
None.gif
extern const IID IID_IY;
None.gif
extern const IID IID_IZ;
None.gif
None.gif
class CA:public IX,public IY
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif 
virtual void __stdcall FY() dot.gif{cout <<"CA::FY"<<endl; } 
ExpandedSubBlockStart.gifContractedSubBlock.gif 
virtual void __stdcall FX() dot.gif{cout <<"CA::FX"<<endl; }       
InBlock.gif 
virtual HRESULT STDMETHODCALLTYPE QueryInterface( 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
/**//* [in] */ REFIID riid,
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   
else if(riid == IID_IY)
ExpandedSubBlockStart.gifContractedSubBlock.gif   
dot.gif{
InBlock.gif    
*ppvObject = static_cast<IY*>(this);
ExpandedSubBlockEnd.gif   }

InBlock.gif   
else if(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    
return E_NOINTERFACE;
ExpandedSubBlockEnd.gif   }

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

InBlock.gif        
ExpandedSubBlockStart.gifContractedSubBlock.gif  
virtual ULONG STDMETHODCALLTYPE AddRef( void)dot.gifreturn 0; }
InBlock.gif        
ExpandedSubBlockStart.gifContractedSubBlock.gif  
virtual ULONG STDMETHODCALLTYPE Release( voiddot.gif{return 0; } 
InBlock.gif
ExpandedBlockEnd.gif}
;
None.gif
None.gifIUnknown 
* CreateInstance()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif     IUnknown 
* pI = static_cast <IX*>(new CA);
InBlock.gif     pI
->AddRef();
InBlock.gif     
return pI;
ExpandedBlockEnd.gif}

None.gif
None.gif
// {1A5EE493-AD77-4224-9A78-5F2DD3874714}
None.gif
static const IID IID_IX = 
ExpandedBlockStart.gifContractedBlock.gif
dot.gif0x1a5ee4930xad770x4224dot.gif0x9a0x780x5f0x2d0xd30x870x470x14 } };
None.gif
None.gif
// {AB55D03D-2160-4197-8AD2-36A36E33F69B}
None.gif
static const IID IID_IY = 
ExpandedBlockStart.gifContractedBlock.gif
dot.gif0xab55d03d0x21600x4197dot.gif0x8a0xd20x360xa30x6e0x330xf60x9b } };
None.gif
None.gif
// {5443E124-25A6-451e-A634-2BA392788C38}
None.gif
static const IID IID_IZ = 
ExpandedBlockStart.gifContractedBlock.gif
dot.gif0x5443e1240x25a60x451edot.gif0xa60x340x2b0xa30x920x780x8c0x38 } };
None.gif
None.gif
int main(int argc, char* argv[])
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    HRESULT  hr;
InBlock.gif    IUnknown 
*pUnknown = CreateInstance();
InBlock.gif    IX 
*pIX = NULL;
InBlock.gif    hr 
= pUnknown->QueryInterface(IID_IX,(void **)(&pIX));
InBlock.gif    
if(SUCCEEDED(hr))
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif         pIX
->FX();
ExpandedSubBlockEnd.gif    }

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

InBlock.gif     delete pUnknown;
InBlock.gif     system(
"pause");
InBlock.gif     
return 0;
ExpandedBlockEnd.gif}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值