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

 
原文地址:https://www.cnblogs.com/GnagWang/p/1769440.html