订阅所有文章
文章搜索

高级搜索这是社么?这是顶尖最新推出的文章增强型搜索功能!
全网 本站
您现在的位置: 顶尖设计 >> IT学院 >> 编程开发 >> VC >> 文章正文

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

作者:skink  来源http://www.codeguru.com/active  点击  更新:2006-12-19 7:07:40  编辑: 画王w  字体

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

[1] [2] 下一页

  • 上一篇文章:

  • 下一篇文章:
  •      
    热门文章  
    推荐文章  
    相关文章    
     发表评论
      关于我们 | 联系我们 | 站点地图 | 广告投放 | 友情链接 | 在线留言 | 版权申明
    版权所有 © 2004-2007 顶尖设计(bobd.cn)
    未经授权禁止转载,摘编,复制本站内容或建立镜像. 沪ICP备05002835号