• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

COM指南 (Step by Step COM Tutorial)-中

发布: 2007-7-01 20:40 | 作者: admin | 来源: | 查看: 11次 | 进入软件测试论坛讨论

领测软件测试网

第四步 实现IAdd的方法

 

我们将在此步骤中提供接口IAdd所有方法的实现。

创建一个新文件(AddObj.cpp),在此文件中添加如下实现代码。

 

///////////////////////////////////////////////////////////

//

//AddObj.cpp

//Contains the method  implementations of the IAdd interface

//interfaces

//

 

#include    <objbase.h>

 

#include    "AddObj.h"

#include    "IAdd_i.c"

 

HRESULT __stdcall CAddObj::SetFirstNumber( long nX1)

    {

    m_nX1=nX1;

    if (m_bIsLogEnabled) WriteToLog("Junk");

    return S_OK;

    }

 

HRESULT __stdcall CAddObj::SetSecondNumber( long nX2)

    {

    m_nX2=nX2;

    return S_OK;

    }

 

HRESULT __stdcall CAddObj::DoTheAddition( long *pBuffer)

    {

    *pBuffer =m_nX1 + m_nX2;

 

    return S_OK;

    }

/////////////////////////////////////////////////////////////////

 

第五步 实现IUnknown

 

IUnknown方法需要被实现。在文件AddObj.cpp中,我们将实现它的三个强制的方法(AddRef,Release和QueryInterface)。私有成员变量m_nRefCount是用来保持对象生命期的,他不被直接的自加/减的,而是我们亲自使用线程安全的方法,使用API函数InterlockedIncrement 和 InterlockedDecrement。

 

/////////////////////////////////////////////////////////////////

 

HRESULT __stdcall CAddObj::QueryInterface(

                                    REFIID riid ,

                                    void **ppObj)

    {

    if (riid == IID_IUnknown)

        {

        *ppObj = static_cast(this) ;

        AddRef() ;

        return S_OK;

        }

 

    if (riid == IID_IAdd)

        {

        *ppObj = static_cast(this) ;

        AddRef() ;

        return S_OK;

        }

 

    //

    //if control reaches here then , let the client know that

    //we do not satisfy the required interface

    //

 

    *ppObj = NULL ;

    return E_NOINTERFACE ;

    }//QueryInterface method

 

 

 

ULONG   __stdcall CAddObj::AddRef()

    {

    return InterlockedIncrement(&m_nRefCount) ;

    }

 

    

   

ULONG   __stdcall CAddObj::Release()

    {    

    long nRefCount=0;

    nRefCount=InterlockedDecrement(&m_nRefCount) ;

    if (nRefCount == 0) delete this;

    return nRefCount;

    }

 

/////////////////////////////////////////////////////////////////

第六步 类工厂

 

我们已经完成了Add COM对象的部分功能。作为每一个COM的准则,每个COM对象必须有一个独立的IClassFactory实现。客户将使用这个接口得到我们IAdd接口实现的实例。IClassFactory接口,像所有其他COM接口一样,继承自IUnknown。因此我们也必须提供一个IUnknown的实现,以及IClassFactory的方法(LockServer 和 CreateInstance)。创建一个新文件(命名为AddObjFactory.h)。声明一个类CAddFactory并使之继承自IClassFactory。

 

///////////////////////////////////////////////////////////

//AddObjFactory.h

//Contains the C++ class declarations for the IClassFactory implementations

//

 

class CAddFactory : public IClassFactory

    {

 

    public:

 

 

    //interface IUnknown methods

    HRESULT __stdcall QueryInterface(

                                REFIID riid ,

                                void **ppObj);

    ULONG   __stdcall AddRef();

    ULONG   __stdcall Release();

 

 

    //interface IClassFactory methods

    HRESULT __stdcall CreateInstance(IUnknown* pUnknownOuter,

                                             const IID& iid,

                                             void** ppv) ;

    HRESULT __stdcall LockServer(BOOL bLock) ;

 

    private:

    long m_nRefCount;

    };

/////////////////////////////////////////////////////////////////

 

 


  • 文章来源于领测软件测试网 https://www.ltesting.net/


    关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
    版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
    北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
    技术支持和业务联系:info@testage.com.cn 电话:010-51297073

    软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网