zoukankan      html  css  js  c++  java
  • 学习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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

     
  • 相关阅读:
    PSFTP使用简单教程
    JavaMail应用--通过javamail API实现在代码中发送邮件功能
    java常用数据类型转换
    自己封装的Java excel数据读取方法
    java怎样实现重载一个方法
    怎样做好测试保证交付产品质量
    软件测试之测试用例颗粒度问题
    Python 一句命令启动一个web服务器
    ansible 模块之在学习--lineinfile
    centos 7 安装sql 审核工具 inception + archer
  • 原文地址:https://www.cnblogs.com/GnagWang/p/1769440.html
Copyright © 2011-2022 走看看