COM逐步教程
2006-07-22 22:54:38 来源:WEB开发网第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;
}
更多精彩
赞助商链接