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 /******************************************************************************
215 * CreateStdDispatch (OLEAUT32.32)
218 HRESULT WINAPI
CreateStdDispatch(
227 if ( punkOuter
== NULL
|| pvThis
== NULL
||
228 pti
== NULL
|| ppvobj
== NULL
)
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
;
237 hr
= CStdDispImpl_Construct( This
, punkOuter
, pvThis
, pti
);
240 IUnknown_Release((IUnknown
*)(&This
->unkimpl
));
243 *ppvobj
= (IUnknown
*)(&This
->unkimpl
);