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