CComPtr ºÍ CComQIPtrÀඨÒå

template 
class CComPtr {
public:
       typedef T _PtrClass;
       CComPtr() {p=NULL;}
       CComPtr(T* lp) {
               if ((p = lp) != NULL)
                       p->AddRef();
       }
       CComPtr(const CComPtr& lp) {
               if ((p = lp.p) != NULL)
                       p->AddRef();
       }
       ~CComPtr() {if (p) p->Release();}
       void Release() {if (p) p->Release(); p=NULL;}
       operator T*() {return (T*)p;}
       T& operator*() {_ASSERTE(p!=NULL); return *p; }
       T** operator&() { _ASSERTE(p==NULL); return &p; }
       T* operator->() { _ASSERTE(p!=NULL); return p; }
       T* operator=(T* lp){return (T*)AtlComPtrAssign((IUnknown**)&p, lp);}
       T* operator=(const CComPtr& lp) {
               return (T*)AtlComPtrAssign((IUnknown**)&p, lp.p);
       }
       bool operator!(){return (p == NULL);}
       T* p;
};

template 
class CComQIPtr
{
public:
       typedef T _PtrClass;
       CComQIPtr() {p=NULL;}
   CComQIPtr(T* lp) {
               if ((p = lp) != NULL)
                       p->AddRef();
       }
       CComQIPtr(const CComQIPtr& lp) {
               if ((p = lp.p) != NULL)
                       p->AddRef();
       }
       CComQIPtr(IUnknown* lp)        {
               p=NULL;
               if (lp != NULL)
                       lp->QueryInterface(*piid, (void **)&p);
       }
       ~CComQIPtr() {if (p) p->Release();}
       void Release() {if (p) p->Release(); p=NULL;}
       operator T*() {return p;}
       T& operator*() {_ASSERTE(p!=NULL); return *p; }
       T** operator&() { _ASSERTE(p==NULL); return &p; }
       T* operator->() {_ASSERTE(p!=NULL); return p; }
       T* operator=(T* lp){return (T*)AtlComPtrAssign((IUnknown**)&p, lp);}
   T* operator=(const CComQIPtr& lp) {
               return (T*)AtlComPtrAssign((IUnknown**)&p, lp.p);
       }
       T* operator=(IUnknown* lp) {
               return (T*)AtlComQIPtrAssign((IUnknown**)&p, lp, *piid);
       }
       bool operator!(){return (p == NULL);}
       T* p;
};
    
¡¡