2 * Copyright 2001 Hidenori Takeshima
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 #include "winnls.h" /* for PRIMARYLANGID */
25 #include "winreg.h" /* for HKEY_LOCAL_MACHINE */
29 #include "wine/debug.h"
30 WINE_DEFAULT_DEBUG_CHANNEL(ole);
32 typedef struct CStdDispImpl
34 ICOM_VFIELD(IDispatch);
35 struct { ICOM_VFIELD(IUnknown); } unkimpl;
43 static HRESULT CStdDispImpl_Construct(
45 IUnknown* punkOuter, void* pvThis, ITypeInfo* pti )
47 This->punk = punkOuter;
48 This->pvThis = pvThis;
49 This->pti = pti; ITypeInfo_AddRef(pti);
54 static void CStdDispImpl_Destruct(
57 if ( This->pti != NULL )
58 ITypeInfo_Release(This->pti);
62 /****************************************************************************/
65 static HRESULT WINAPI In_CStdDispImpl_fnQueryInterface(
66 IUnknown* iface,REFIID riid,void** ppvobj)
68 CStdDispImpl* This = (CStdDispImpl*)(((BYTE*)iface)-offsetof(CStdDispImpl,unkimpl));
70 if ( IsEqualGUID(riid,&IID_IUnknown) )
72 *ppvobj = (void*)iface;
73 IUnknown_AddRef(iface);
76 if ( IsEqualGUID(riid,&IID_IDispatch) )
78 *ppvobj = (void*)This;
79 IUnknown_AddRef((IUnknown*)This);
86 static ULONG WINAPI In_CStdDispImpl_fnAddRef(IUnknown* iface)
88 CStdDispImpl* This = (CStdDispImpl*)(((BYTE*)iface)-offsetof(CStdDispImpl,unkimpl));
93 static ULONG WINAPI In_CStdDispImpl_fnRelease(IUnknown* iface)
95 CStdDispImpl* This = (CStdDispImpl*)(((BYTE*)iface)-offsetof(CStdDispImpl,unkimpl));
97 if ( -- This->ref > 0 ) return This->ref;
100 CStdDispImpl_Destruct(This);
101 HeapFree(GetProcessHeap(),0,This);
106 /****************************************************************************/
110 static HRESULT WINAPI CStdDispImpl_fnQueryInterface(
111 IDispatch* iface,REFIID riid,void** ppvobj)
113 ICOM_THIS(CStdDispImpl,iface);
115 return IUnknown_QueryInterface(This->punk,riid,ppvobj);
118 static ULONG WINAPI CStdDispImpl_fnAddRef(IDispatch* iface)
120 ICOM_THIS(CStdDispImpl,iface);
122 return IUnknown_AddRef(This->punk);
125 static ULONG WINAPI CStdDispImpl_fnRelease(IDispatch* iface)
127 ICOM_THIS(CStdDispImpl,iface);
129 return IUnknown_Release(This->punk);
133 static HRESULT WINAPI CStdDispImpl_fnGetTypeInfoCount(
134 IDispatch* iface,UINT* pctinfo)
136 ICOM_THIS(CStdDispImpl,iface);
138 FIXME("(%p)\n",This);
139 if ( pctinfo == NULL ) return E_POINTER;
145 static HRESULT WINAPI CStdDispImpl_fnGetTypeInfo(
147 UINT itiindex,LCID lcid,ITypeInfo** ppti)
149 ICOM_THIS(CStdDispImpl,iface);
151 FIXME("(%p)\n",This);
153 if ( ppti != NULL ) return E_POINTER;
156 if ( itiindex != 0 ) return DISP_E_BADINDEX;
157 /* lcid is ignored */
158 ITypeInfo_AddRef(This->pti);
164 static HRESULT WINAPI CStdDispImpl_fnGetIDsOfNames(
166 REFIID riid,LPOLESTR* ppwszNames,UINT cNames,LCID lcid,DISPID* pdispid)
168 ICOM_THIS(CStdDispImpl,iface);
170 FIXME("(%p)\n",This);
171 return DispGetIDsOfNames(This->pti,ppwszNames,cNames,pdispid);
174 static HRESULT WINAPI CStdDispImpl_fnInvoke(
176 DISPID dispid,REFIID riid,LCID lcid,WORD wFlags,
177 DISPPARAMS* pDispParams,VARIANT* pVarResult,
178 EXCEPINFO* pExcepInfo,UINT* puArgErr)
180 ICOM_THIS(CStdDispImpl,iface);
182 FIXME("(%p)\n",This);
183 return DispInvoke(This->pvThis,
184 This->pti,dispid,wFlags,
185 pDispParams,pVarResult,
186 pExcepInfo,puArgErr);
189 static ICOM_VTABLE(IUnknown) iunk =
191 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
194 In_CStdDispImpl_fnQueryInterface,
195 In_CStdDispImpl_fnAddRef,
196 In_CStdDispImpl_fnRelease,
199 static ICOM_VTABLE(IDispatch) idisp =
201 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
204 CStdDispImpl_fnQueryInterface,
205 CStdDispImpl_fnAddRef,
206 CStdDispImpl_fnRelease,
208 CStdDispImpl_fnGetTypeInfoCount,
209 CStdDispImpl_fnGetTypeInfo,
210 CStdDispImpl_fnGetIDsOfNames,
211 CStdDispImpl_fnInvoke,
214 /*****************************************************************************/
216 HRESULT WINAPI CreateStdDispatch(
225 if ( punkOuter == NULL || pvThis == NULL ||
226 pti == NULL || ppvobj == NULL )
229 This = (CStdDispImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(CStdDispImpl));
230 if ( This == NULL ) return E_OUTOFMEMORY;
231 ICOM_VTBL(This) = &idisp;
232 ICOM_VTBL(&(This->unkimpl)) = &iunk;
235 hr = CStdDispImpl_Construct( This, punkOuter, pvThis, pti );
238 IUnknown_Release((IUnknown*)(&This->unkimpl));
241 *ppvobj = (IUnknown*)(&This->unkimpl);