50分讨教com中的工场类的m_ref引用计数的作用及实际应用中的问题
关于工场类中的m_ref(引用计数)的问题
工厂类中的 中的m_ref到底有什么用?为什么在DllGetClassObject 中创建工厂对象后, 立即查询接口,殊不知查询接口的代码很奇怪?(为什么说其诡异, 原因是:尽管你有了工厂对象,但是 你没有创建com对象A啊, 增加次数m_ref有什么用呢?)extern "C" HRESULT __stdcall DllGetClassObject(const CLSID& clsid, const IID& iid, void **ppv){ if (clsid == CLSID_CompA) { CAFactory *pFactory = new CAFactory; //只有工厂对象,没有com对象!!! if (pFactory == NULL) { return E_OUTOFMEMORY ; } HRESULT result = pFactory->QueryInterface(iid, ppv); //开始查询接口,都没有com对象,查了作甚? return result; } else { return CLASS_E_CLASSNOTAVAILABLE; }}class CAFactory : public IClassFactory{ protected: ULONG m_Ref; //look here ..................... //IUnknown members HRESULT __stdcall QueryInterface(const IID& iid, void **ppv); ULONG __stdcall AddRef(); ULONG __stdcall Release();};以下是CAFactory::QueryInterface的代码:HRESULT CAFactory::QueryInterface(const IID& iid, void **ppv){ if ( iid == IID_IUnknown ) { *ppv = (IUnknown *) this ; ((IUnknown *)(*ppv))->AddRef() ; //增加了m_ref的次数,有什么用呢?无用啊 } else if ( iid == IID_IClassFactory) { *ppv = (IClassFactory *) this ; ((IClassFactory *)(*ppv))->AddRef() ; //同理这里也是 } else { *ppv = NULL; return E_NOINTERFACE ; } return S_OK;}