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

发表于:2007-07-01来源:作者:点击数: 标签:
第四步 实现 IAdd 的方法 我们将在此步骤中提供接口IAdd所有方法的实现。 创建一个新文件(AddObj.cpp),在此文件中添加如下实现代码。 /////////////////////////////////////////////////////////// // //AddObj.cpp //Contains the method implementatio

第四步 实现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;

    };

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

 

 


  • 原文转自:http://www.ltesting.net