#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
请按任意键继续. . .