diff --git a/reactos/sdk/lib/atl/atlcomcli.h b/reactos/sdk/lib/atl/atlcomcli.h index b7b8d0b0582..9c19e3371c4 100644 --- a/reactos/sdk/lib/atl/atlcomcli.h +++ b/reactos/sdk/lib/atl/atlcomcli.h @@ -149,6 +149,66 @@ public: }; +//CComQIIDPtr is the gcc compatible version of CComQIPtr +#define I_ID(Itype) Itype,IID_##Itype + +template +class CComQIIDPtr : + public CComPtr +{ +public: + CComQIIDPtr() + { + } + CComQIIDPtr(_Inout_opt_ T* lp) : + CComPtr(lp) + { + } + CComQIIDPtr(_Inout_ const CComQIIDPtr& lp): + CComPtr(lp.p) + { + } + CComQIIDPtr(_Inout_opt_ IUnknown* lp) + { + if (lp != NULL) + { + if (FAILED(lp->QueryInterface(*piid, (void **)&this.p))) + this.p = NULL; + } + } + T *operator = (T *lp) + { + if (this.p != NULL) + this.p->Release(); + this.p = lp; + if (this.p != NULL) + this.p->AddRef(); + return *this; + } + + T *operator = (const CComQIIDPtr &lp) + { + if (this.p != NULL) + this.p->Release(); + this.p = lp.p; + if (this.p != NULL) + this.p->AddRef(); + return *this; + } + + T * operator=(IUnknown* lp) + { + if (this.p != NULL) + this.p->Release(); + + if (FAILED(lp->QueryInterface(*piid, (void **)&this.p))) + this.p = NULL; + + return *this; + } +}; + + class CComBSTR { public: