WEB开发网
开发学院软件开发VC COM逐步教程 阅读

COM逐步教程

 2006-07-22 22:54:38 来源:WEB开发网   
核心提示: 第4步:我们将要为IAdd接口的所有方法提供实现,创建一个新文件(AddObj.cpp)并实现如下代码的所有方法,COM逐步教程(3),///AddObj.cpp//包含IAdd接口的方法实现//#include<objbase.h>#include"AddObj.h

第4步:

我们将要为IAdd接口的所有方法提供实现。创建一个新文件(AddObj.cpp)并实现如下代码的所有方法。

///////////////////////////////////////////////////////////
//
//AddObj.cpp
//包含IAdd接口的方法实现
//
#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;
   }

第5步:

我们还需要实现IUnknown的方法。我们将要在相同的文件AddObj.cpp中实现3个固定的方法(AddRef、Release和QueryInterface)。那个private成员m_nRefCount用于维护对象的生存期。m_nRefCount不会直接减少或增加,我们采用了一种线程安全的做法,也就是使用互锁增加和减少的API。

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;
     }
   //
   //如果控制达到了这里,那么就让客户端知道
   //我们不支持请求的接口
   //
   *ppObj = NULL ;
   return E_NOINTERFACE ;
   }//QueryInterfac方法
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;
   }

上一页  1 2 3 4 5 6 7 8  下一页

Tags:COM 逐步 教程

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接