Added some shdocvw ordinals and stubs.
[wine/gsoc_dplay.git] / dlls / oleaut32 / dispstd.c
blob22615425754a2cb54faac65d8a0ba618040e228c
1 /*
2 * Copyright 2001 Hidenori Takeshima
4 * FIXME - stub
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
21 #include "config.h"
23 #include "winerror.h"
24 #include "winnls.h" /* for PRIMARYLANGID */
25 #include "winreg.h" /* for HKEY_LOCAL_MACHINE */
26 #include "winuser.h"
27 #include "oleauto.h"
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;
36 UINT ref;
38 IUnknown* punk;
39 void* pvThis;
40 ITypeInfo* pti;
41 } CStdDispImpl;
43 static HRESULT CStdDispImpl_Construct(
44 CStdDispImpl* This,
45 IUnknown* punkOuter, void* pvThis, ITypeInfo* pti )
47 This->punk = punkOuter;
48 This->pvThis = pvThis;
49 This->pti = pti; ITypeInfo_AddRef(pti);
51 return S_OK;
54 static void CStdDispImpl_Destruct(
55 CStdDispImpl* This )
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);
74 return S_OK;
76 if ( IsEqualGUID(riid,&IID_IDispatch) )
78 *ppvobj = (void*)This;
79 IUnknown_AddRef((IUnknown*)This);
80 return S_OK;
83 return E_NOINTERFACE;
86 static ULONG WINAPI In_CStdDispImpl_fnAddRef(IUnknown* iface)
88 CStdDispImpl* This = (CStdDispImpl*)(((BYTE*)iface)-offsetof(CStdDispImpl,unkimpl));
90 return ++ This->ref;
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;
99 ++ This->ref;
100 CStdDispImpl_Destruct(This);
101 HeapFree(GetProcessHeap(),0,This);
102 return 0;
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;
140 *pctinfo = 1;
142 return S_OK;
145 static HRESULT WINAPI CStdDispImpl_fnGetTypeInfo(
146 IDispatch* iface,
147 UINT itiindex,LCID lcid,ITypeInfo** ppti)
149 ICOM_THIS(CStdDispImpl,iface);
151 FIXME("(%p)\n",This);
153 if ( ppti != NULL ) return E_POINTER;
154 *ppti = NULL;
156 if ( itiindex != 0 ) return DISP_E_BADINDEX;
157 /* lcid is ignored */
158 ITypeInfo_AddRef(This->pti);
159 *ppti = This->pti;
161 return S_OK;
164 static HRESULT WINAPI CStdDispImpl_fnGetIDsOfNames(
165 IDispatch* iface,
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(
175 IDispatch* iface,
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
193 /* IUnknown */
194 In_CStdDispImpl_fnQueryInterface,
195 In_CStdDispImpl_fnAddRef,
196 In_CStdDispImpl_fnRelease,
199 static ICOM_VTABLE(IDispatch) idisp =
201 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
203 /* IUnknown */
204 CStdDispImpl_fnQueryInterface,
205 CStdDispImpl_fnAddRef,
206 CStdDispImpl_fnRelease,
207 /* IDispatch */
208 CStdDispImpl_fnGetTypeInfoCount,
209 CStdDispImpl_fnGetTypeInfo,
210 CStdDispImpl_fnGetIDsOfNames,
211 CStdDispImpl_fnInvoke,
214 /******************************************************************************
215 * CreateStdDispatch (OLEAUT32.32)
218 HRESULT WINAPI CreateStdDispatch(
219 IUnknown* punkOuter,
220 void* pvThis,
221 ITypeInfo* pti,
222 IUnknown** ppvobj )
224 HRESULT hr;
225 CStdDispImpl* This;
227 if ( punkOuter == NULL || pvThis == NULL ||
228 pti == NULL || ppvobj == NULL )
229 return E_POINTER;
231 This = (CStdDispImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(CStdDispImpl));
232 if ( This == NULL ) return E_OUTOFMEMORY;
233 ICOM_VTBL(This) = &idisp;
234 ICOM_VTBL(&(This->unkimpl)) = &iunk;
235 This->ref = 1;
237 hr = CStdDispImpl_Construct( This, punkOuter, pvThis, pti );
238 if ( FAILED(hr) )
240 IUnknown_Release((IUnknown*)(&This->unkimpl));
241 return hr;
243 *ppvobj = (IUnknown*)(&This->unkimpl);
245 return S_OK;