IUnknown

来源:互联网 发布:淘宝如何修改收货地址 编辑:程序博客网 时间:2024/05/20 01:34
#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
请按任意键继续. . .
0 0
原创粉丝点击