HRESULT _stdcall CompTestFactory::QueryInterface(const IID &riid, void **ppvObject)
{
if (IID_IUnknown == riid){
*ppvObject = (IUnknown*)this;
((IUnknown*)(*ppvObject))->AddRef();
}
else if (IID_IClassFactory == riid){
*ppvObject = (IClassFactory*)this;
((IClassFactory*)(*ppvObject))->AddRef();
}
else{
*ppvObject = NULL;
return E_NOINTERFACE;
}
return S_OK;
}
ULONG _stdcall CompTestFactory::AddRef()
{
m_Ref ++;
return m_Ref;
}
ULONG _stdcall CompTestFactory::Release()
{
m_Ref --;
if (0 == m_Ref){
delete this;
return 0;
}
return m_Ref;
}
HRESULT _stdcall CompTestFactory::CreateInstance(IUnknown *pUnkOuter, const IID &riid, void **ppvObject)//最重要的函数,这个函数创建CompTestClass对象,并返回所需接口
{
if (NULL != pUnkOuter){
return CLASS_E_NOAGGREGATION;
}
HRESULT hr = E_OUTOFMEMORY;
CompTestClass::Init();
CompTestClass* pObj = new CompTestClass();
if (NULL == pObj){
return hr;
}
hr = pObj->QueryInterface(riid, ppvObject);
if (S_OK != hr){
delete pObj;
}
return hr;
}
HRESULT _stdcall CompTestFactory::LockServer(BOOL fLock)
{
return NOERROR;
}
以下是客户程序的运行结果

本文深入探讨了COM组件工厂的实现细节,包括QueryInterface、AddRef、Release等关键方法的运作原理,以及如何通过CreateInstance函数创建并返回指定接口的CompTestClass对象。此外,还介绍了LockServer函数的作用。
2752

被折叠的 条评论
为什么被折叠?



