Author: gadamopoulos Date: Mon Jun 19 14:52:51 2017 New Revision: 75129 URL: http://svn.reactos.org/svn/reactos?rev=75129&view=rev Log: [ATL] -Add a new template called CComQIIDPtr and its partner I_ID macro. Its purpose is to be a gcc compatible version of CComQIPtr. -CComQIIDPtr<I_ID(Itype)> is the gcc compatible version of CComQIPtr<Itype> - WARNING: this is not tested yet.
Modified: trunk/reactos/sdk/lib/atl/atlcomcli.h Modified: trunk/reactos/sdk/lib/atl/atlcomcli.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/sdk/lib/atl/atlcomcli.h?rev=75129&r1=75128&r2=75129&view=diff ============================================================================== --- trunk/reactos/sdk/lib/atl/atlcomcli.h [iso-8859-1] (original) +++ trunk/reactos/sdk/lib/atl/atlcomcli.h [iso-8859-1] Mon Jun 19 14:52:51 2017 @@ -149,6 +149,66 @@ }; +//CComQIIDPtr<I_ID(Itype)> is the gcc compatible version of CComQIPtr<Itype> +#define I_ID(Itype) Itype,IID_##Itype + +template <class T, const IID* piid> +class CComQIIDPtr : + public CComPtr<T> +{ +public: + CComQIIDPtr() + { + } + CComQIIDPtr(_Inout_opt_ T* lp) : + CComPtr<T>(lp) + { + } + CComQIIDPtr(_Inout_ const CComQIIDPtr<T,piid>& lp): + CComPtr<T>(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<T,piid> &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: