• 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();
    }

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

    编辑器加载中...

  • 相关阅读:
    HTML + CSS短标题(二,三,四文字长度)两端对齐的方式
    转载 ----MAC 上搭建lua
    转载 -- 基于原生JS与OC方法互相调用并传值(附HTML代码)
    转载 ---资深HR告诉你:我如何筛选简历与选择人员的
    转载 OSX开发推荐书籍列表
    IOS --支付宝SDK 分解讲解
    IOS -RSA加密及解密
    ios --转载 使用SMSSDK实现短信验证:
    ios --转载 在mac上安装让rvm及cocoa pods详解
    简单说明Python中的装饰器的用法
  • 原文地址:https://www.cnblogs.com/threef/p/3147595.html
Copyright © 2020-2023  润新知