[ATL]
authorGiannis Adamopoulos <gadamopoulos@reactos.org>
Mon, 19 Jun 2017 14:52:51 +0000 (14:52 +0000)
committerGiannis Adamopoulos <gadamopoulos@reactos.org>
Mon, 19 Jun 2017 14:52:51 +0000 (14:52 +0000)
-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.

svn path=/trunk/; revision=75129

reactos/sdk/lib/atl/atlcomcli.h

index b7b8d0b..9c19e33 100644 (file)
@@ -149,6 +149,66 @@ public:
 };
 
 
+//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: