+//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;
+ }
+};
+
+