Main Page | Class Hierarchy | Class List | Directories | File List | Class Members | File Members | Related Pages

GCom.h

00001 #ifndef _GCOM_H_
00002 #define _GCOM_H_
00003 
00004 #include <WTYPES.H>
00005 #include <OAIDL.H>
00006 
00007 template <class T>
00008 class GUnknownImpl : public T
00009 {
00010     int Count;
00011 
00012     class Interface
00013     {
00014     public:
00015         REFIID iid;
00016         void *pvObject;
00017 
00018         Interface(REFIID i, void *p) : iid(i)
00019         {
00020             pvObject = p;
00021         }
00022     };
00023 
00024     List<Interface> Interfaces;
00025 
00026 protected:
00027     void AddInterface(REFIID iid, void *pvObject)
00028     {
00029         Interface *i = NEW(Interface(iid, pvObject));
00030         if (i)
00031         {
00032             Interfaces.Insert(i);
00033         }
00034     }
00035 
00036 public:
00037     GUnknownImpl()
00038     {
00039         Count = 0;
00040     }
00041 
00042     virtual ~GUnknownImpl()
00043     {
00044         Interfaces.DeleteObjects();
00045     }
00046     
00047     // IUnknown
00048     HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject)
00049     {
00050         if (memcmp(&IID_IUnknown, &iid, sizeof(IID)) == 0)
00051         {
00052             *ppvObject = this;
00053             AddRef();
00054             return S_OK;
00055         }
00056 
00057         for (Interface *i = Interfaces.First(); i; i=Interfaces.Next())
00058         {
00059             if (memcmp(&i->iid, &iid, sizeof(IID)) == 0)
00060             {
00061                 *ppvObject = i->pvObject;
00062                 AddRef();
00063                 return S_OK;
00064             }
00065         }
00066 
00067         return E_NOINTERFACE;
00068     }
00069 
00070     ULONG STDMETHODCALLTYPE AddRef()
00071     {
00072         return ++Count;
00073     }
00074     
00075     ULONG STDMETHODCALLTYPE Release()
00076     {
00077         int i = --Count;
00078         if (i <= 0)
00079         {
00080             delete this;
00081         }
00082         return  i;
00083     }
00084 
00085     // Helpers
00086     BSTR VariantToBstr(VARIANT *v)
00087     {
00088         if (v)
00089         {
00090             if (v->vt == (VT_VARIANT | VT_BYREF)) v = v->pvarVal;
00091             
00092             if (v->vt == VT_BSTR) return v->bstrVal;
00093             if (v->vt == (VT_BSTR | VT_BYREF)) return *v->pbstrVal;
00094         }
00095 
00096         return 0;
00097     }
00098 };
00099 
00100 template <class T>
00101 class GDispatchImpl : public T
00102 {
00103 public:
00104     HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT __RPC_FAR *pctinfo)
00105     {
00106         return S_OK;
00107     }
00108     
00109     HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo)
00110     {
00111         return S_OK;
00112     }
00113     
00114     HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid,
00115                                             LPOLESTR __RPC_FAR *rgszNames,
00116                                             UINT cNames,
00117                                             LCID lcid,
00118                                             DISPID __RPC_FAR *rgDispId)
00119     {
00120         return S_OK;
00121     }
00122     
00123     HRESULT STDMETHODCALLTYPE Invoke(       DISPID dispIdMember,
00124                                             REFIID riid,
00125                                             LCID lcid,
00126                                             WORD wFlags,
00127                                             DISPPARAMS __RPC_FAR *pDispParams,
00128                                             VARIANT __RPC_FAR *pVarResult,
00129                                             EXCEPINFO __RPC_FAR *pExcepInfo,
00130                                             UINT __RPC_FAR *puArgErr)
00131     {
00132         return S_OK;
00133     }
00134 };
00135 
00136 #endif

Generated on Wed Oct 26 14:46:48 2005 for Lgi by  doxygen 1.4.1