首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

50分讨教com中的工场类的m_ref引用计数的作用及实际应用中的有关问题

2012-10-16 
50分讨教com中的工场类的m_ref引用计数的作用及实际应用中的问题关于工场类中的m_ref(引用计数)的问题C/C+

50分讨教com中的工场类的m_ref引用计数的作用及实际应用中的问题
关于工场类中的m_ref(引用计数)的问题

C/C++ code
工厂类中的 中的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;}



以上代码来自 com原理与应用





[解决办法]
工厂是一种模式

你的确可以不用工厂而不妨碍COM的使用

但如果你要用工厂模式的话,工厂对象也得按COM规范来
[解决办法]
概念混淆得令人发指
CreateInstance你没搜到就说明没人调了?所有COM CLIENT在要求创建对象时都必须最终调到这个函数。你自己调试运行在里面打个断点看看是谁调的
构造函数里不能调虚函数是因为虚表初始化此时还未完成,但这跟你说的CreateInstance毫无关系

热点排行