IUnknown

#include <iostream>
#include <objbase.h>
using namespace std;

extern const IID IID_A;
extern const IID IID_B;
extern const IID IID_C;

// {32bb8320-b41b-11cf-a6bb-0080c7b2d682}
static const IID IID_A = 
{0x32bb8320, 0xb41b, 0x11cf,
{0xa6, 0xbb, 0x0, 0x80, 0xc7, 0xb2, 0xd6, 0x82}} ;

// {32bb8321-b41b-11cf-a6bb-0080c7b2d682}
static const IID IID_B = 
{0x32bb8321, 0xb41b, 0x11cf,
{0xa6, 0xbb, 0x0, 0x80, 0xc7, 0xb2, 0xd6, 0x82}} ;

// {32bb8322-b41b-11cf-a6bb-0080c7b2d682}
static const IID IID_C = 
{0x32bb8322, 0xb41b, 0x11cf,
{0xa6, 0xbb, 0x0, 0x80, 0xc7, 0xb2, 0xd6, 0x82}} ;


interface A:IUnknown
{
	virtual void ATest(void)=NULL;
};

interface B:IUnknown
{
	virtual void BTest(void)=NULL;
};

interface C:IUnknown
{
	virtual void CTest(void)=NULL;
};




class CA:public A,B
{
public:
	virtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppv);
	virtual ULONG __stdcall AddRef();
	virtual ULONG __stdcall Release();

public:
	virtual void ATest(void){cout<<"ATest"<<endl;}
	virtual void BTest(void){cout<<"BTest"<<endl;}

public:
	CA(){m_cRef=0;}
private:
	long m_cRef;

};

HRESULT __stdcall CA::QueryInterface(const IID& iid, void** ppv)
{
	if (iid==IID_IUnknown)
	{
		*ppv=static_cast<A*>(this);
	}
	else if (iid== IID_A)
	{
		*ppv=static_cast<A*>(this);
	}
	else if (iid== IID_B)
	{
		*ppv=static_cast<B*>(this);
	}
	else
	{
		*ppv=NULL;
		return E_NOINTERFACE;
	}

	reinterpret_cast<IUnknown*>(*ppv)->AddRef();
	return S_OK;
}

ULONG __stdcall CA::AddRef()
{
	return InterlockedIncrement(&m_cRef);
}

ULONG __stdcall CA::Release()
{
	if (InterlockedDecrement(&m_cRef)==0)
	{
		delete this;
		return 0;
	}
	return m_cRef;
}



IUnknown* CreateInstance()
{
	IUnknown *pI=static_cast<A*>(new CA);
	pI->AddRef();
	return pI;
}


int main (void)
{
	HRESULT hr;
	IUnknown* pIUnknown=CreateInstance();

	A* pA=NULL;
	hr=pIUnknown->QueryInterface(IID_A,(void**)&pA);
	if (SUCCEEDED(hr))
	{
		pA->ATest();
		pA->Release();
	}

	B* pB=NULL;
	hr=pIUnknown->QueryInterface(IID_B,(void**)&pB);
	if (SUCCEEDED(hr))
	{
		pB->BTest();
		pB->Release();
	}
	
	C* pC=NULL;
	hr=pIUnknown->QueryInterface(IID_C,(void**)&pC);
	if (SUCCEEDED(hr))
	{
		pC->CTest();
		pC->Release();
	}
	else
	{
		cout<<"error"<<endl;
	}
	
	B* pIA=NULL;
	hr=pA->QueryInterface(IID_B,(void**)&pIA);
	if(SUCCEEDED(hr))
	{
		pIA->BTest();
		pIA->Release();
	}

	//IUnknown* pIUnknownFromIY = NULL ;
	//hr = pB->QueryInterface(IID_IUnknown, (void**)&pIUnknownFromIY) ;
	//if (SUCCEEDED(hr))
	//{
	//	if (pIUnknownFromIY == pIUnknown)
	//	{
	//		cout << "Yes, pIUnknownFromIY == pIUnknown." << endl ;
	//	}
	//	else
	//	{
	//		cout << "No, pIUnknownFromIY != pIUnknown." << endl ;
	//	}
	//}


	pIUnknown->Release();

	return 0;
}

ATest
BTest
error
BTest
请按任意键继续. . .
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值