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