COM学习笔记(十一 ):聚合的一个完整例子

这篇博客详细介绍了COM组件的聚合过程,以Component1和Component2为例,展示了如何创建和初始化组件,以及如何通过IUnknown接口进行聚合操作。内容包括组件间的交互、接口查询、引用计数等关键概念。
摘要由CSDN通过智能技术生成

//Cmpnt1.cpp -- Component1

#include <iostream.h>

#include <objbase.h>

#include "Iface.h"

#include "Registry.h"

void trace(const char* msg){cout<<"Component1; \t "<<msg<<endl;}

static HMODULE g_hModule = NULL;

static long g_cComponents = 0;

static long g_cServerLocks = 0;

const char g_szFriendlyName[] = "Inside COM,Component1";

const char g_szProgID[] = "InsideCOM.Cmpnt1_1";

//

class CA : public IX{

public:

virtual HRESULT __stdcall QueryInterface(const IID& iid,void** ppv);

virtual ULONG __stdcall AddRef();

virtual ULONG __stdcall Release();

virtual void __stdcall Fx(){cout<<"Fx"<<endl;}

virtual void __stdcall Fy(){m_pIY->Fy();}

CA();

~CA();

HRESULT __stdcall Init();

private:

long m_cRef;

IY* m_pIY;

IUnknown* m_pUnknownInner;

};

CA::CA():m_cRef(1),m_pUnknownInner(NULL){

InterlockedIncrement(&m_cComponents);

}

CA::~CA(){

InterlockedDecrement(&g_cComponents);

trace("Destroy self.");

m_cRef = 1;

IUnknown* pUnknownOuter = this;

pUnknownOuter->AddRef();

m_pIY->Release();

if(m_pUnknownInner != NULL){

m_pUnknownInner->Release();

}

HRESULT __stdcall CA::Init(){

IUnknown* pUnknownOuter = this;

trace("Create inner component.");

HRESULT hr = ::CoCreateInstance(CLSID_Component2,pUnknownOuter, CLSCTX_INPROC_SERVER,  IID_IUnknown, (void**)&m_pUnknownInner);

if(FAILED(hr)){

trace("Could not create contained component.");

return E_FAIL;

}

hr = m_pUnknownInner->QueryInterface(IID_IY,(void**)&m_pIY);

if(FAILED(hr)){

trace("Inner component does not support interface IY.");

m_pUnknowInner->Release();

return E_FAIL;

}

pUnknownOuter->Release();

return S_OK;

}

HRESULT __stdcall CA::QueryInterface(const IID& iid,void** ppv){

if(iid == IID_IUnknown){

*ppv = static_cast<IUnknown*>(this);

}

else if(iid == IID_IX){

*ppv = static_cast<IX*>(this);

}

else if(iid == IID_IY){

trace("Return inner component's IY interface.");

return m_pUnknownInner->QueryInterface(iid,ppv);

//or  *ppv = m_pIY;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值