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
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
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