zoukankan      html  css  js  c++  java
  • A simple Demo

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

    void trace(const char * msg)
    {
    cout<<msg<<endl;
    }

    //Forward references for GUIDs
    extern const IID IID_IX;
    extern const IID IID_IY;
    extern const IID IID_IZ;

    //Interfaces
    interface IX :IUnknown
    {
    virtual void _stdcall Fx() = 0;
    };

    interface IY :IUnknown
    {
    virtual void _stdcall Fy() = 0;
    };

    interface IZ :IUnknown
    {
    virtual void _stdcall Fz() = 0;
    };
    //
    //Component
    //
    class CA : public IX,
    public IY
    {
    public:
    //IUnknown implementation
    virtual HRESULT _stdcall QueryInterface(const IID& iid, void** ppv);
    virtual ULONG _stdcall AddRef();
    virtual ULONG _stdcall Release();

    //Interface IX implementation
    virtual void _stdcall Fx()
    {
    cout<<"Fx"<<endl;
    }

    //Interface IX implementation
    virtual void _stdcall Fy()
    {
    cout<<"Fy"<<endl;
    }

    //Constructor
    CA():m_cRef(0){}

    //Destructor
    ~CA()
    {
    trace("CA: Destory self.");
    }
    private:
    long m_cRef;
    };

    HRESULT _stdcall CA::QueryInterface(const IID& iid, void** ppv)
    {
    if (IID_IUnknown == iid)
    {
    trace("CA QI: Return pointer to IUnknown.");
    *ppv = static_cast<IX*>(this);
    }
    else if(IID_IX == iid)
    {
    trace("CA QI: Return pointer to IX.");
    *ppv = static_cast<IX*>(this);
    }
    else if(IID_IY == iid)
    {
    trace("CA QI: Return pointer to IY.");
    *ppv = static_cast<IY*>(this);
    }
    else
    {
    trace("CA QI: Interface note supported.");
    *ppv = NULL;
    return E_NOINTERFACE;
    }
    reinterpret_cast<IUnknown*>(*ppv)->AddRef();
    return S_OK;
    }

    ULONG _stdcall CA::AddRef()
    {
    cout<<"CA: AddRef = "<<m_cRef + 1<<'.'<<endl;
    return InterlockedIncrement(&m_cRef);
    }

    ULONG _stdcall CA::Release()
    {
    cout<<"CA: Release = "<<m_cRef - 1<<'.'<<endl;
    if (0 == InterlockedDecrement(&m_cRef))
    {
    delete this;
    return 0;
    }
    return m_cRef;
    }

    //
    //Creation function
    //
    IUnknown* CreateInstance()
    {
    IUnknown* pI = static_cast<IX*>(new CA);
    pI->AddRef();
    return pI;
    }

    //
    //IIDS
    //
    //{32bb8320-b41b-11cf-a6bb-0080c7b2d682}
    const IID IID_IX =
    {
    0x32bb8320,0xb41b,0x11cf,
    {0xa6,0xbb,0x0,0x80,0xc7,0xb2,0xd6,0x82}};
    //{32bb8321-b41b-11cf-a6bb-0080c7b2d682}
    const IID IID_IY =
    {
    0x32bb8321,0xb41b,0x11cf,
    {0xa6,0xbb,0x0,0x80,0xc7,0xb2,0xd6,0x82}};
    //{32bb8322-b41b-11cf-a6bb-0080c7b2d682}
    const IID IID_IZ =
    {
    0x32bb8322,0xb41b,0x11cf,
    {0xa6,0xbb,0x0,0x80,0xc7,0xb2,0xd6,0x82}};

    //
    //Client
    //
    int main()
    {
    HRESULT hr;
    trace("Client:Get an IUnknown pointer.");
    IUnknown* pIUnknown = CreateInstance();
    trace("Client:Get interface IX.");
    IX* pIX = NULL;
    hr = pIUnknown->QueryInterface(IID_IX,(void**)&pIX);
    if (SUCCEEDED(hr))
    {
    trace("Client:Succeeded getting IX.");
    pIX->Fx(); //Use interface IX.
    pIX->Release();
    }

    trace("Client:Get interface IY.");
    IY* pIY = NULL;
    hr = pIUnknown->QueryInterface(IID_IY,(void**)&pIY);
    if (SUCCEEDED(hr))
    {
    trace("Client:Succeeded getting IY.");
    pIY->Fy(); //Use interface IY.
    pIY->Release();
    }

    trace("Client:Ask for an unsupported interface.");
    IZ* pIZ = NULL;
    hr = pIUnknown->QueryInterface(IID_IZ,(void**)&pIZ);
    if (SUCCEEDED(hr))
    {
    trace("Client:Succeeded getting IZ.");
    pIZ->Fz();
    pIZ->Release();
    }
    else
    {
    trace("Client:Could not get interface IZ.");
    }

    trace("Client:Release IUnknown interface.");
    pIUnknown->Release();

    return 0;
    }


  • 相关阅读:
    sqoop基本命令
    sqoop-介绍及安装
    HBase与Hive的集成操作
    Phoenix简介及操作
    HBase-Rest API操作
    HBase-Java Native API操作
    HBase-shell操作
    HBase-基本架构
    HBase-物理模型
    HBase-集群安装
  • 原文地址:https://www.cnblogs.com/BeyondTechnology/p/1972160.html
Copyright © 2011-2022 走看看