4 * Copyright 2000 Patrik Stridvall, Juergen Schmied
7 * The errorinfo is a per-thread object. The reference is stored in the
11 #include "debugtools.h"
16 #include "debugtools.h"
17 #include "wine/obj_errorinfo.h"
19 DEFAULT_DEBUG_CHANNEL(ole)
21 typedef struct ErrorInfoImpl
23 ICOM_VTABLE(IErrorInfo) *lpvtei;
24 ICOM_VTABLE(ICreateErrorInfo) *lpvtcei;
25 ICOM_VTABLE(ISupportErrorInfo) *lpvtsei;
31 static ICOM_VTABLE(IErrorInfo) IErrorInfoImpl_VTable;
32 static ICOM_VTABLE(ICreateErrorInfo) ICreateErrorInfoImpl_VTable;
33 static ICOM_VTABLE(ISupportErrorInfo) ISupportErrorInfoImpl_VTable;
36 converts a objectpointer to This
38 #define _IErrorInfo_Offset ((int)(&(((ErrorInfoImpl*)0)->lpvtei)))
39 #define _ICOM_THIS_From_IErrorInfo(class, name) class* This = (class*)(((char*)name)-_IErrorInfo_Offset);
41 #define _ICreateErrorInfo_Offset ((int)(&(((ErrorInfoImpl*)0)->lpvtcei)))
42 #define _ICOM_THIS_From_ICreateErrorInfo(class, name) class* This = (class*)(((char*)name)-_ICreateErrorInfo_Offset);
44 #define _ISupportErrorInfo_Offset ((int)(&(((ErrorInfoImpl*)0)->lpvtsei)))
45 #define _ICOM_THIS_From_ISupportErrorInfo(class, name) class* This = (class*)(((char*)name)-_ISupportErrorInfo_Offset);
48 converts This to a objectpointer
50 #define _IErrorInfo_(This) (IErrorInfo*)&(This->lpvtei)
51 #define _ICreateErrorInfo_(This) (ICreateErrorInfo*)&(This->lpvtcei)
52 #define _ISupportErrorInfo_(This) (ISupportErrorInfo*)&(This->lpvtsei)
54 IErrorInfo * IErrorInfoImpl_Constructor()
56 ErrorInfoImpl * ei = HeapAlloc(GetProcessHeap(), 0, sizeof(ErrorInfoImpl));
59 ei->lpvtei = &IErrorInfoImpl_VTable;
60 ei->lpvtcei = &ICreateErrorInfoImpl_VTable;
61 ei->lpvtsei = &ISupportErrorInfoImpl_VTable;
64 return (IErrorInfo *)ei;
68 static HRESULT WINAPI IErrorInfoImpl_QueryInterface(
73 _ICOM_THIS_From_IErrorInfo(ErrorInfoImpl, iface);
74 TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvoid);
78 if(IsEqualIID(riid, &IID_IErrorInfo))
80 *ppvoid = _IErrorInfo_(This);
82 else if(IsEqualIID(riid, &IID_ICreateErrorInfo))
84 *ppvoid = _ICreateErrorInfo_(This);
86 else if(IsEqualIID(riid, &IID_ISupportErrorInfo))
88 *ppvoid = _ISupportErrorInfo_(This);
93 IUnknown_AddRef( (IUnknown*)*ppvoid );
94 TRACE("-- Interface: (%p)->(%p)\n",ppvoid,*ppvoid);
97 TRACE("-- Interface: E_NOINTERFACE\n");
101 static ULONG WINAPI IErrorInfoImpl_AddRef(
104 _ICOM_THIS_From_IErrorInfo(ErrorInfoImpl, iface);
105 TRACE("(%p)->(count=%lu)\n",This,This->ref);
106 return InterlockedIncrement(&This->ref);
109 static ULONG WINAPI IErrorInfoImpl_Release(
112 _ICOM_THIS_From_IErrorInfo(ErrorInfoImpl, iface);
113 TRACE("(%p)->(count=%lu)\n",This,This->ref);
115 if (!InterlockedDecrement(&This->ref))
117 TRACE("-- destroying IErrorInfo(%p)\n",This);
118 HeapFree(GetProcessHeap(),0,This);
124 static HRESULT WINAPI IErrorInfoImpl_GetTypeInfoCount(
126 unsigned int* pctinfo)
128 _ICOM_THIS_From_IErrorInfo(ErrorInfoImpl, iface);
129 FIXME("(%p)\n", This);
134 static HRESULT WINAPI IErrorInfoImpl_GetTypeInfo(
140 _ICOM_THIS_From_IErrorInfo(ErrorInfoImpl, iface);
141 FIXME("(%p)\n", This);
146 static HRESULT WINAPI IErrorInfoImpl_GetIDsOfNames(
154 _ICOM_THIS_From_IErrorInfo(ErrorInfoImpl, iface);
155 FIXME("(%p)\n", This);
160 static HRESULT WINAPI IErrorInfoImpl_Invoke(
166 DISPPARAMS* pDispParams,
168 EXCEPINFO* pExepInfo,
171 _ICOM_THIS_From_IErrorInfo(ErrorInfoImpl, iface);
172 FIXME("(%p)\n", This);
177 /* FIXME: is this OK? Original is GUID* pGUID! This can't work! (js) */
178 static HRESULT WINAPI IErrorInfoImpl_GetGUID(
182 _ICOM_THIS_From_IErrorInfo(ErrorInfoImpl, iface);
183 FIXME("(%p) check function prototype\n", This);
185 if(!pGUID || !*pGUID)return E_INVALIDARG;
186 *pGUID = This->pGuid;
190 static HRESULT WINAPI IErrorInfoImpl_GetSource(
194 _ICOM_THIS_From_IErrorInfo(ErrorInfoImpl, iface);
195 FIXME("(%p)\n", This);
200 static HRESULT WINAPI IErrorInfoImpl_GetDescription(
202 BSTR *pBstrDescription)
204 _ICOM_THIS_From_IErrorInfo(ErrorInfoImpl, iface);
205 FIXME("(%p)\n", This);
210 static HRESULT WINAPI IErrorInfoImpl_GetHelpFile(
214 _ICOM_THIS_From_IErrorInfo(ErrorInfoImpl, iface);
215 FIXME("(%p)\n", This);
220 static HRESULT WINAPI IErrorInfoImpl_GetHelpContext(
222 DWORD *pdwHelpContext)
224 _ICOM_THIS_From_IErrorInfo(ErrorInfoImpl, iface);
225 FIXME("(%p)\n", This);
230 static ICOM_VTABLE(IErrorInfo) IErrorInfoImpl_VTable =
232 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
233 IErrorInfoImpl_QueryInterface,
234 IErrorInfoImpl_AddRef,
235 IErrorInfoImpl_Release,
236 IErrorInfoImpl_GetTypeInfoCount,
237 IErrorInfoImpl_GetTypeInfo,
238 IErrorInfoImpl_GetIDsOfNames,
239 IErrorInfoImpl_Invoke,
241 IErrorInfoImpl_GetGUID,
242 IErrorInfoImpl_GetSource,
243 IErrorInfoImpl_GetDescription,
244 IErrorInfoImpl_GetHelpFile,
245 IErrorInfoImpl_GetHelpContext
249 static HRESULT WINAPI ICreateErrorInfoImpl_QueryInterface(
250 ICreateErrorInfo* iface,
254 _ICOM_THIS_From_ICreateErrorInfo(ErrorInfoImpl, iface);
255 TRACE("(%p)\n", This);
256 return IErrorInfo_QueryInterface(_IErrorInfo_(This), riid, ppvoid);
259 static ULONG WINAPI ICreateErrorInfoImpl_AddRef(
260 ICreateErrorInfo* iface)
262 _ICOM_THIS_From_ICreateErrorInfo(ErrorInfoImpl, iface);
263 TRACE("(%p)\n", This);
264 return IErrorInfo_AddRef(_IErrorInfo_(This));
267 static ULONG WINAPI ICreateErrorInfoImpl_Release(
268 ICreateErrorInfo* iface)
270 _ICOM_THIS_From_ICreateErrorInfo(ErrorInfoImpl, iface);
271 TRACE("(%p)\n", This);
272 return IErrorInfo_Release(_IErrorInfo_(This));
275 static HRESULT WINAPI ICreateErrorInfoImpl_GetTypeInfoCount(
276 ICreateErrorInfo* iface,
277 unsigned int* pctinfo)
279 _ICOM_THIS_From_ICreateErrorInfo(ErrorInfoImpl, iface);
280 TRACE("(%p)\n", This);
281 return IErrorInfo_GetTypeInfoCount(_IErrorInfo_(This), pctinfo);
284 static HRESULT WINAPI ICreateErrorInfoImpl_GetTypeInfo(
285 ICreateErrorInfo* iface,
290 _ICOM_THIS_From_ICreateErrorInfo(ErrorInfoImpl, iface);
291 TRACE("(%p)\n", This);
292 return IErrorInfo_GetTypeInfo(_IErrorInfo_(This),iTInfo,lcid,ppTInfo);
295 static HRESULT WINAPI ICreateErrorInfoImpl_GetIDsOfNames(
296 ICreateErrorInfo* iface,
303 _ICOM_THIS_From_ICreateErrorInfo(ErrorInfoImpl, iface);
304 TRACE("(%p)\n", This);
305 return IErrorInfo_GetIDsOfNames(_IErrorInfo_(This),riid,rgszNames,cNames,lcid,rgDispId);
308 static HRESULT WINAPI ICreateErrorInfoImpl_Invoke(
309 ICreateErrorInfo* iface,
314 DISPPARAMS* pDispParams,
316 EXCEPINFO* pExepInfo,
319 _ICOM_THIS_From_ICreateErrorInfo(ErrorInfoImpl, iface);
320 TRACE("(%p)\n", This);
321 return IErrorInfo_Invoke(_IErrorInfo_(This),dispIdMember,riid,lcid,wFlags,pDispParams,
322 pVarResult,pExepInfo,puArgErr);
325 static HRESULT WINAPI ICreateErrorInfoImpl_SetGUID(
326 ICreateErrorInfo* iface,
329 _ICOM_THIS_From_ICreateErrorInfo(ErrorInfoImpl, iface);
330 TRACE("(%p)->(%s)\n", This, debugstr_guid(rguid));
335 static HRESULT WINAPI ICreateErrorInfoImpl_SetSource(
336 ICreateErrorInfo* iface,
339 _ICOM_THIS_From_ICreateErrorInfo(ErrorInfoImpl, iface);
340 FIXME("(%p)\n", This);
345 static HRESULT WINAPI ICreateErrorInfoImpl_SetDescription(
346 ICreateErrorInfo* iface,
347 LPOLESTR szDescription)
349 _ICOM_THIS_From_ICreateErrorInfo(ErrorInfoImpl, iface);
350 FIXME("(%p)\n", This);
355 static HRESULT WINAPI ICreateErrorInfoImpl_SetHelpFile(
356 ICreateErrorInfo* iface,
359 _ICOM_THIS_From_ICreateErrorInfo(ErrorInfoImpl, iface);
360 FIXME("(%p)\n", This);
365 static HRESULT WINAPI ICreateErrorInfoImpl_SetHelpContext(
366 ICreateErrorInfo* iface,
369 _ICOM_THIS_From_ICreateErrorInfo(ErrorInfoImpl, iface);
370 FIXME("(%p)\n", This);
375 static ICOM_VTABLE(ICreateErrorInfo) ICreateErrorInfoImpl_VTable =
377 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
378 ICreateErrorInfoImpl_QueryInterface,
379 ICreateErrorInfoImpl_AddRef,
380 ICreateErrorInfoImpl_Release,
382 ICreateErrorInfoImpl_GetTypeInfoCount,
383 ICreateErrorInfoImpl_GetTypeInfo,
384 ICreateErrorInfoImpl_GetIDsOfNames,
385 ICreateErrorInfoImpl_Invoke,
387 ICreateErrorInfoImpl_SetGUID,
388 ICreateErrorInfoImpl_SetSource,
389 ICreateErrorInfoImpl_SetDescription,
390 ICreateErrorInfoImpl_SetHelpFile,
391 ICreateErrorInfoImpl_SetHelpContext
394 static HRESULT WINAPI ISupportErrorInfoImpl_QueryInterface(
395 ISupportErrorInfo* iface,
399 _ICOM_THIS_From_ISupportErrorInfo(ErrorInfoImpl, iface);
400 FIXME("(%p)\n", This);
402 return IErrorInfo_QueryInterface(_IErrorInfo_(This), riid, ppvoid);
405 static ULONG WINAPI ISupportErrorInfoImpl_AddRef(
406 ISupportErrorInfo* iface)
408 _ICOM_THIS_From_ISupportErrorInfo(ErrorInfoImpl, iface);
409 TRACE("(%p)\n", This);
410 return IErrorInfo_AddRef(_IErrorInfo_(This));
413 static ULONG WINAPI ISupportErrorInfoImpl_Release(
414 ISupportErrorInfo* iface)
416 _ICOM_THIS_From_ISupportErrorInfo(ErrorInfoImpl, iface);
417 TRACE("(%p)\n", This);
418 return IErrorInfo_Release(_IErrorInfo_(This));
421 static HRESULT WINAPI ISupportErrorInfoImpl_GetTypeInfoCount(
422 ISupportErrorInfo* iface,
423 unsigned int* pctinfo)
425 _ICOM_THIS_From_ISupportErrorInfo(ErrorInfoImpl, iface);
426 TRACE("(%p)\n", This);
427 return IErrorInfo_GetTypeInfoCount(_IErrorInfo_(This), pctinfo);
430 static HRESULT WINAPI ISupportErrorInfoImpl_GetTypeInfo(
431 ISupportErrorInfo* iface,
436 _ICOM_THIS_From_ISupportErrorInfo(ErrorInfoImpl, iface);
437 TRACE("(%p)\n", This);
438 return IErrorInfo_GetTypeInfo(_IErrorInfo_(This),iTInfo,lcid,ppTInfo);
441 static HRESULT WINAPI ISupportErrorInfoImpl_GetIDsOfNames(
442 ISupportErrorInfo* iface,
449 _ICOM_THIS_From_ISupportErrorInfo(ErrorInfoImpl, iface);
450 TRACE("(%p)\n", This);
451 return IErrorInfo_GetIDsOfNames(_IErrorInfo_(This),riid,rgszNames,cNames,lcid,rgDispId);
454 static HRESULT WINAPI ISupportErrorInfoImpl_Invoke(
455 ISupportErrorInfo* iface,
460 DISPPARAMS* pDispParams,
462 EXCEPINFO* pExepInfo,
465 _ICOM_THIS_From_ISupportErrorInfo(ErrorInfoImpl, iface);
466 TRACE("(%p)\n", This);
467 return IErrorInfo_Invoke(_IErrorInfo_(This),dispIdMember,riid,lcid,wFlags,pDispParams,
468 pVarResult,pExepInfo,puArgErr);
471 static HRESULT WINAPI ISupportErrorInfoImpl_InterfaceSupportsErrorInfo(
472 ISupportErrorInfo* iface,
475 _ICOM_THIS_From_ISupportErrorInfo(ErrorInfoImpl, iface);
476 TRACE("(%p)->(%s)\n", This, debugstr_guid(riid));
477 return (riid == This->pGuid) ? S_OK : S_FALSE;
480 static ICOM_VTABLE(ISupportErrorInfo) ISupportErrorInfoImpl_VTable =
482 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
483 ISupportErrorInfoImpl_QueryInterface,
484 ISupportErrorInfoImpl_AddRef,
485 ISupportErrorInfoImpl_Release,
487 ISupportErrorInfoImpl_GetTypeInfoCount,
488 ISupportErrorInfoImpl_GetTypeInfo,
489 ISupportErrorInfoImpl_GetIDsOfNames,
490 ISupportErrorInfoImpl_Invoke,
492 ISupportErrorInfoImpl_InterfaceSupportsErrorInfo
494 /***********************************************************************
497 HRESULT WINAPI CreateErrorInfo(ICreateErrorInfo **pperrinfo)
502 TRACE("(%p): stub:\n", pperrinfo);
504 if(! pperrinfo || !*pperrinfo) return E_INVALIDARG;
505 if(!(pei=IErrorInfoImpl_Constructor()))return E_OUTOFMEMORY;
507 res = IErrorInfo_QueryInterface(pei, &IID_ICreateErrorInfo, (LPVOID*)pperrinfo);
508 IErrorInfo_Release(pei);
512 /***********************************************************************
515 HRESULT WINAPI GetErrorInfo(ULONG dwReserved, IErrorInfo **pperrinfo)
517 TRACE("(%ld, %p): stub:\n", dwReserved, pperrinfo);
519 if(! pperrinfo || !*pperrinfo) return E_INVALIDARG;
520 if(!(*pperrinfo = (IErrorInfo*)(NtCurrentTeb()->ErrorInfo))) return S_FALSE;
522 /* clear thread error state */
523 NtCurrentTeb()->ErrorInfo = NULL;
527 /***********************************************************************
530 HRESULT WINAPI SetErrorInfo(ULONG dwReserved, IErrorInfo *perrinfo)
533 TRACE("(%ld, %p): stub:\n", dwReserved, perrinfo);
535 /* release old errorinfo */
536 pei = (IErrorInfo*)NtCurrentTeb()->ErrorInfo;
537 if(pei) IErrorInfo_Release(pei);
539 /* set to new value */
540 NtCurrentTeb()->ErrorInfo = perrinfo;
541 if(perrinfo) IErrorInfo_AddRef(perrinfo);