zoukankan      html  css  js  c++  java
  • Windows,Com,Second Example

    ---恢复内容开始---

    #include <windows.h>
    #include <shobjidl.h> 
    #include <atlbase.h> // Contains the declaration of CComPtr.
    // {EEA4592E-D18C-4FE1-939F-7A9771B27289}
    static const GUID IID_IX = 
    { 0xeea4592e, 0xd18c, 0x4fe1, { 0x93, 0x9f, 0x7a, 0x97, 0x71, 0xb2, 0x72, 0x89 } };
    
    __interface IX : public IUnknown
    {
        virtual void fnc_x() = 0;
    
    };
    // {62B59A4E-E480-4E15-B57F-707906502BCD}
    static const GUID IID_IY = 
    { 0x62b59a4e, 0xe480, 0x4e15, { 0xb5, 0x7f, 0x70, 0x79, 0x6, 0x50, 0x2b, 0xcd } };
    
    __interface IY : public IUnknown
    {
        virtual void fnc_y() = 0;
    };
    // {D5086CAB-CF19-4CEC-8CF7-7B5F03A53BF3}
    static const GUID IID_IZ = 
    { 0xd5086cab, 0xcf19, 0x4cec, { 0x8c, 0xf7, 0x7b, 0x5f, 0x3, 0xa5, 0x3b, 0xf3 } };
    
    __interface IZ : public IUnknown
    {
       virtual void __stdcall fnc_z() = 0;
    };
    
    class MyClass : public IX, public IY
    {
    public:
        MyClass() : m_cRef(0) {}
        ~MyClass()
        {
            MessageBox(0, _T("MyClass dtor"), _T("message"), MB_OK);
        }
    
        virtual HRESULT __stdcall QueryInterface(REFIID riid, _COM_Outptr_ void **ppvObject)
        {
            if (riid == IID_IUnknown)
            {
                MessageBox(0, _T("QueryInterface IID_IUnknow"), _T("message"), MB_OK);
                *ppvObject = static_cast<IX*>(this);
            }
            else if (riid == IID_IX)
            {
                MessageBox(0, _T("QueryInterface IID_IX"), _T("message"), MB_OK);
                *ppvObject = static_cast<IX*>(this);
            }
            else if (riid == IID_IY)
            {
                MessageBox(0, _T("QueryInterface IID_IY"), _T("message"), MB_OK);
                *ppvObject = static_cast<IY*>(this);
            }
            else
            {
                MessageBox(0, _T("QueryInterface not exist"), _T("message"), MB_OK);
                *ppvObject = NULL;
                return E_NOINTERFACE;
            }
            reinterpret_cast<IUnknown*>(*ppvObject)->AddRef();
            return S_OK;
    
        }
        virtual ULONG __stdcall AddRef()
        {
            return InterlockedIncrement(&m_cRef);
    
        }
        virtual ULONG __stdcall Release()
        {
            if (InterlockedDecrement(&m_cRef) == 0)
            {
               delete this;
               return 0;
            }
            return m_cRef;
    
        }
        virtual void fnc_x()
        {
            MessageBox(0, _T("MyClass fnc_x"), _T("message"), MB_OK);
        }
        virtual void fnc_y()
        {
            MessageBox(0, _T("MyClass fnc_y"), _T("message"), MB_OK);
        }
    
    
    private:
        long m_cRef;
    
    };
    IUnknown * CreateInstance()
    {
    
        IUnknown * pI = static_cast<IX*>(new MyClass);
        pI->AddRef();
        return pI;
    }
    int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow)
    {
        HRESULT hr;
        IUnknown * pIunknown = CreateInstance();
        IX * pIX = NULL;
        hr = pIunknown->QueryInterface(IID_IX, (void**)(&pIX));
        if (SUCCEEDED(hr))
        {
            pIX->fnc_x();
            pIX->Release();
        }
        IZ * pIz = NULL;
        hr = pIunknown->QueryInterface(IID_IZ, (void**)&pIz);
        if (SUCCEEDED(hr))
        {
            pIz->fnc_z();
            pIz->Release();
        }
        else
        {
    
    
        }
        pIunknown->Release();
    }

    ---恢复内容结束---

    编辑器加载中...

  • 相关阅读:
    Tomcat vs Jetty vs Undertow性能对比
    实例对象( instance)、类对象(class)、元类对象(meta-class)的内部结构分析
    isa和superclass
    iOS-weak关键字使用场景
    iOS-weak和assign区别,copy和strong的区别和应用
    iOS-class修饰符的解释及用法
    iOS-atomic修饰符原理剖析讲解 (你将会了解到什么是优先级翻转、自旋锁、互斥锁)
    @property修饰符种类
    @property、@synthesize 、@dynamic的应用
    【原创】Kafka Consumer多线程消费
  • 原文地址:https://www.cnblogs.com/threef/p/3147595.html
Copyright © 2011-2022 走看看