COM编程入门:深入COM服务器
2006-07-21 11:44:59 来源:WEB开发网riid 和ppv 与在QueryInterface()中的用法一样——它们是客户端所请求的接口IID和存储接口指针的指针缓冲。
下面是CreateInstance()的实现。它从参数的有效性检查和参数的初始化开始。
HRESULT CSimpleMsgBoxClassFactory::CreateInstance ( IUnknown* pUnkOuter,
REFIID riid,
void** ppv )
{
// 因为不支持聚合,所以这个参数pUnkOuter必须为NULL.
if ( NULL != pUnkOuter )
return CLASS_E_NOAGGREGATION;
//检查指针ppv是不是void*类型
if ( IsBadWritePtr ( ppv, sizeof(void*) ))
return E_POINTER;
*ppv = NULL;
检查完参数的有效性后,就可以创建一个新的对象了。
CSimpleMsgBoxImpl* pMsgbox;
// 创建一个新的COM对象
pMsgbox = new CSimpleMsgBoxImpl;
if ( NULL == pMsgbox )
return E_OUTOFMEMORY;
最后,用QI()来查询客户端所请求的新对象的接口。如果QI()失败,则这个对象不可用,必须删除它。
HRESULT hrRet;
// 用QI查询客户端所请求的对象接口
hrRet = pMsgbox->QueryInterface ( riid, ppv );
// 如果QI失败,则删除这个COM对象,因为客户端不能使用它(客户端没有
//这个对象的任何接口)
if ( FAILED(hrRet) )
delete pMsgbox;
return hrRet;
}
深入DllGetClassObject()
现在让我们深入DllGetClassObject()内部。它的原型是:
更多精彩
赞助商链接