• 学习Com[一]


    先从最简单的地方入手,废话省去,直接开始:

    1、我用的是vc2005, 新建一个win32工程, 新建一个clsid.h的文件:

    #include <Unknwn.h>
    // {B73A1FEA-0FCF-4b67-87F9-19EC95B1901A}
    static const GUID WG_TEST_CLSID =
    { 0xb73a1fea, 0xfcf, 0x4b67, { 0x87, 0xf9, 0x19, 0xec, 0x95, 0xb1, 0x90, 0x1a } };

    声名一个GUID来做为要完成的com的标志。

    2、新建一个interface.h文件来定义接口:

    #include <Unknwn.h>

    interface ITestAdd : public IUnknown
    {
    public:
        virtual int AddOpt(int a, int b) = 0;
    };

    这个接口是用来完成一个加法的功能。

    3、开始实现一个类继承于这个接口:

    #include "clsid.h"
    #include "interface.h"

    class CAdd : public ITestAdd
    {
    private:
        ULONG m_cRef;

    public:
        STDMETHOD(QueryInterface)(REFIID  riid, void **ppv);
        STDMETHOD_(ULONG, AddRef) ();
        STDMETHOD_(ULONG, Release) ();

        int AddOpt(int a, int b);

        CAdd(void);

    };

    并完成功能:

    #include "stdafx.h"
    #include "add.h"

    CAdd::CAdd(void)
    {
        this->m_cRef = 0;
    }
    int CAdd::AddOpt( int a, int b )
    {
        return a + b;
    }

    STDMETHODIMP_(ULONG) CAdd::AddRef ()
    {
        return ++this->m_cRef;
    }

    STDMETHODIMP_(ULONG) CAdd::Release ()
    {
        ULONG res = --this->m_cRef;
        if (res == 0)
        {
            delete this;
        }

        return res;
    }


    STDMETHODIMP CAdd::QueryInterface( REFIID  riid, void **ppv)
    {
        if ( riid == WG_TEST_CLSID )
        {
            *ppv = static_cast<IUnknown*>(this);
        }
        else
        {
            *ppv = NULL;
            return E_NOINTERFACE;
        }

        reinterpret_cast <IUnknown*> (*ppv)-> AddRef();

        return S_OK;
    }

    好了,一个最最简单的com出生了,开始运行一下:


    #include "stdafx.h"
    #include "add.h"

    int _tmain(int argc, _TCHAR* argv[])
    {
        ITestAdd * pTestAdd = NULL;
        CAdd * pAdd = new CAdd();
        pAdd->QueryInterface(WG_TEST_CLSID, (void **)&pTestAdd);

        if (pTestAdd)
        {
            int c = pTestAdd->AddOpt(1, 2);
            printf("%d", c);

        }

        pTestAdd->Release();
        return 0;
    }

    以上。

     


    作者:GangWang
    出处:http://www.cnblogs.com/GnagWang/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

     
  • 相关阅读:
    C# 日期帮助类【原创】
    C# 发送邮件
    每日一题力扣453
    每日力扣628
    每日一题力扣41巨坑
    每日一题力扣274
    每日一题力扣442有坑
    每日一题力扣495
    每日一题力扣645
    每日一题力扣697
  • 原文地址:https://www.cnblogs.com/GnagWang/p/1769440.html
Copyright © 2020-2023  润新知