构造函数引用计数加1-Read
十六 ATL;1 ATL对COM客户端的支持;实现了引用计数后, 每个对象维护一个引用计数,当接口指针被复制的时候,计数增加;接口指针被销毁的时候,计数减少。 1。当接口指针被复制时,调用DuplicatePointer 即AddRef 2。当接口指针不再有用时调用DestroyPointer 即Releasevoid f(void){ IFastString *pfs=0; IPersistentObject *ppo=0; pfs=CreateFastString("asdf"); if(pfs) { ppo=(IPersistentObject*) pfs->Dynamic_Cast("IPersistentObject"); if(ppo) { ppo->Save("c:\\myfile"); ppo->DestroyPointer();} //每个指针各自负责自己。 pfs->DestroyPointer();//每个指针各自负责自己。 }}或者使用正式的表达方式:;void GetLottaPointers(LPUNKNOWN pUnk){ HRESULT hr; LPPERSIST pPersist; LPDISPATCH pDispatch; LPDATAOBJECT pDataObject; hr = pUnk->QueryInterface(IID_IPersist, (LPVOID *)&pPersist); //引用计数加1 if(SUCCEEDED(hr)) { hr = pUnk->QueryInterface(IID_IDispatch, (LPVOID *) &pDispatch); //引用计数加1 if(SUCCEEDED(hr)) { hr = pUnk->QueryInterface(IID_IDataObject, (LPVOID *) &pDataObject); //引用计数加1 if(SUCCEEDED(hr)) { DoIt(pPersist, pDispatch, pDataObject); //同时使用三个指针 pDataObject->Release(); } //释放引用 pDispatch->Release(); } //释放引用pPersist->Release(); } //释放引用 pUnk指向的对象的引用计数在退出此函数时保持不变。对象检测到引用为零时,会删除自己。 }比较没有引用计数的情况,有了很大的进步。但是仍然要小心。;CComPtr;/* 重载了=操作符进行赋值操作,在赋值操作时: 1当前接口指针非NULL时,Release 2源接口指针非NULL时,AddRef 3把源接口指针保存为当前接口指针*/
这里使用了AtlComPtrAssign函数。 IUnkown* AtlComPtrAssign(IUnknown**pp,IUnkown *lp){ if(*pp) (*pp)->Release(); // 当前指针要指向新的对象,原对象引用要减1 if(lp) lp->AddRef(); //源指针要被复制,引用计数要加1。 *pp=lp; return lp;}......};在智能指针的支持下,对象的引用计数处理起来更加方便:void GetLottaPointers(LPUNKNOWN pUnk){ HRESULT hr; CComPtr persist; CComPtr dispatch; CComPtr dataobject; hr = pUnk->QueryInterface(IID_IPersist, (LPVOID *)&persist); //引用计数不变if(FAILED(hr)) return;hr = pUnk->QueryInterface(IID_IDispatch, (LPVOID *) &dispatch); //引用计数不变if(FAILED(hr)) return; hr =