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:


Reply via email to