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

Generated on Tue May 2 10:24:41 2006 for Lgi by  doxygen 1.4.1