Changeset 6711 for trunk/src/ole32/errorinfo.c
- Timestamp:
- Sep 15, 2001, 11:32:00 AM (24 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/ole32/errorinfo.c
r6648 r6711 1 /* $Id: errorinfo.c,v 1.3 2001-09-05 13:17:09 bird Exp $ */2 1 /* 3 2 * ErrorInfo API … … 6 5 * 7 6 * 8 * The errorinfo is a per-thread object. The reference is stored in the 7 * The errorinfo is a per-thread object. The reference is stored in the 9 8 * TEB at offset 0xf80 10 9 */ … … 31 30 WCHAR* stringBuffer; 32 31 DWORD len; 33 32 34 33 if (in == NULL) 35 34 return NULL; 36 35 /* 37 36 * Find the lenth of the buffer passed-in in bytes. … … 90 89 { 91 90 DWORD* bufferPointer; 92 91 93 92 /* NULL is a valid parameter */ 94 93 if(!in) return; … … 112 111 typedef struct ErrorInfoImpl 113 112 { 114 ICOM_VTABLE(IErrorInfo)*lpvtei;115 ICOM_VTABLE(ICreateErrorInfo)*lpvtcei;116 ICOM_VTABLE(ISupportErrorInfo)*lpvtsei;117 DWORDref;118 119 120 121 122 123 113 ICOM_VTABLE(IErrorInfo) *lpvtei; 114 ICOM_VTABLE(ICreateErrorInfo) *lpvtcei; 115 ICOM_VTABLE(ISupportErrorInfo) *lpvtsei; 116 DWORD ref; 117 118 GUID m_Guid; 119 BSTR bstrSource; 120 BSTR bstrDescription; 121 BSTR bstrHelpFile; 122 DWORD m_dwHelpContext; 124 123 } ErrorInfoImpl; 125 124 126 static ICOM_VTABLE(IErrorInfo) 127 static ICOM_VTABLE(ICreateErrorInfo) 128 static ICOM_VTABLE(ISupportErrorInfo) 125 static ICOM_VTABLE(IErrorInfo) IErrorInfoImpl_VTable; 126 static ICOM_VTABLE(ICreateErrorInfo) ICreateErrorInfoImpl_VTable; 127 static ICOM_VTABLE(ISupportErrorInfo) ISupportErrorInfoImpl_VTable; 129 128 130 129 /* 131 130 converts a objectpointer to This 132 131 */ 133 #define _IErrorInfo_Offset ((int)(&(((ErrorInfoImpl*)0)->lpvtei))) 134 #define _ICOM_THIS_From_IErrorInfo(class, name) class* This = (class*)(((char*)name)-_IErrorInfo_Offset); 135 136 #define _ICreateErrorInfo_Offset ((int)(&(((ErrorInfoImpl*)0)->lpvtcei))) 137 #define _ICOM_THIS_From_ICreateErrorInfo(class, name) class* This = (class*)(((char*)name)-_ICreateErrorInfo_Offset); 138 139 #define _ISupportErrorInfo_Offset ((int)(&(((ErrorInfoImpl*)0)->lpvtsei))) 140 #define _ICOM_THIS_From_ISupportErrorInfo(class, name) class* This = (class*)(((char*)name)-_ISupportErrorInfo_Offset); 132 #define _IErrorInfo_Offset ((int)(&(((ErrorInfoImpl*)0)->lpvtei))) 133 #define _ICOM_THIS_From_IErrorInfo(class, name) class* This = (class*)(((char*)name)-_IErrorInfo_Offset); 134 135 #define _ICreateErrorInfo_Offset ((int)(&(((ErrorInfoImpl*)0)->lpvtcei))) 136 #define _ICOM_THIS_From_ICreateErrorInfo(class, name) class* This = (class*)(((char*)name)-_ICreateErrorInfo_Offset); 137 138 #define _ISupportErrorInfo_Offset ((int)(&(((ErrorInfoImpl*)0)->lpvtsei))) 139 #define _ICOM_THIS_From_ISupportErrorInfo(class, name) class* This = (class*)(((char*)name)-_ISupportErrorInfo_Offset); 141 140 142 141 /* 143 142 converts This to a objectpointer 144 143 */ 145 #define _IErrorInfo_(This) 146 #define _ICreateErrorInfo_(This) 147 #define _ISupportErrorInfo_(This) 144 #define _IErrorInfo_(This) (IErrorInfo*)&(This->lpvtei) 145 #define _ICreateErrorInfo_(This) (ICreateErrorInfo*)&(This->lpvtcei) 146 #define _ISupportErrorInfo_(This) (ISupportErrorInfo*)&(This->lpvtsei) 148 147 149 148 IErrorInfo * IErrorInfoImpl_Constructor() 150 149 { 151 152 153 154 155 156 157 158 159 160 161 162 163 150 ErrorInfoImpl * ei = HeapAlloc(GetProcessHeap(), 0, sizeof(ErrorInfoImpl)); 151 if (ei) 152 { 153 ei->lpvtei = &IErrorInfoImpl_VTable; 154 ei->lpvtcei = &ICreateErrorInfoImpl_VTable; 155 ei->lpvtsei = &ISupportErrorInfoImpl_VTable; 156 ei->ref = 1; 157 ei->bstrSource = NULL; 158 ei->bstrDescription = NULL; 159 ei->bstrHelpFile = NULL; 160 ei->m_dwHelpContext = 0; 161 } 162 return (IErrorInfo *)ei; 164 163 } 165 164 166 165 167 166 static HRESULT WINAPI IErrorInfoImpl_QueryInterface( 168 169 170 171 { 172 173 174 175 176 177 178 179 *ppvoid = _IErrorInfo_(This); 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 167 IErrorInfo* iface, 168 REFIID riid, 169 VOID** ppvoid) 170 { 171 _ICOM_THIS_From_IErrorInfo(ErrorInfoImpl, iface); 172 TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvoid); 173 174 *ppvoid = NULL; 175 176 if(IsEqualIID(riid, &IID_IErrorInfo)) 177 { 178 *ppvoid = _IErrorInfo_(This); 179 } 180 else if(IsEqualIID(riid, &IID_ICreateErrorInfo)) 181 { 182 *ppvoid = _ICreateErrorInfo_(This); 183 } 184 else if(IsEqualIID(riid, &IID_ISupportErrorInfo)) 185 { 186 *ppvoid = _ISupportErrorInfo_(This); 187 } 188 189 if(*ppvoid) 190 { 191 IUnknown_AddRef( (IUnknown*)*ppvoid ); 192 TRACE("-- Interface: (%p)->(%p)\n",ppvoid,*ppvoid); 193 return S_OK; 194 } 195 TRACE("-- Interface: E_NOINTERFACE\n"); 196 return E_NOINTERFACE; 198 197 } 199 198 200 199 static ULONG WINAPI IErrorInfoImpl_AddRef( 201 202 { 203 204 205 200 IErrorInfo* iface) 201 { 202 _ICOM_THIS_From_IErrorInfo(ErrorInfoImpl, iface); 203 TRACE("(%p)->(count=%lu)\n",This,This->ref); 204 return InterlockedIncrement(&This->ref); 206 205 } 207 206 208 207 static ULONG WINAPI IErrorInfoImpl_Release( 209 210 { 211 212 213 214 215 216 217 218 219 220 208 IErrorInfo* iface) 209 { 210 _ICOM_THIS_From_IErrorInfo(ErrorInfoImpl, iface); 211 TRACE("(%p)->(count=%lu)\n",This,This->ref); 212 213 if (!InterlockedDecrement(&This->ref)) 214 { 215 TRACE("-- destroying IErrorInfo(%p)\n",This); 216 HeapFree(GetProcessHeap(),0,This); 217 return 0; 218 } 219 return This->ref; 221 220 } 222 221 223 222 static HRESULT WINAPI IErrorInfoImpl_GetGUID( 224 225 GUID * pGUID) 226 { 227 228 229 230 231 223 IErrorInfo* iface, 224 GUID * pGUID) 225 { 226 _ICOM_THIS_From_IErrorInfo(ErrorInfoImpl, iface); 227 TRACE("(%p)->(count=%lu)\n",This,This->ref); 228 if(!pGUID )return E_INVALIDARG; 229 memcpy(pGUID, &This->m_Guid, sizeof(GUID)); 230 return S_OK; 232 231 } 233 232 234 233 static HRESULT WINAPI IErrorInfoImpl_GetSource( 235 236 237 { 238 239 240 241 242 243 234 IErrorInfo* iface, 235 BSTR *pBstrSource) 236 { 237 _ICOM_THIS_From_IErrorInfo(ErrorInfoImpl, iface); 238 TRACE("(%p)->(pBstrSource=%p)\n",This,pBstrSource); 239 if (pBstrSource == NULL) 240 return E_INVALIDARG; 241 *pBstrSource = ERRORINFO_SysAllocString(This->bstrSource); 242 return S_OK; 244 243 } 245 244 246 245 static HRESULT WINAPI IErrorInfoImpl_GetDescription( 247 248 249 { 250 251 252 253 254 255 256 257 246 IErrorInfo* iface, 247 BSTR *pBstrDescription) 248 { 249 _ICOM_THIS_From_IErrorInfo(ErrorInfoImpl, iface); 250 251 TRACE("(%p)->(pBstrDescription=%p)\n",This,pBstrDescription); 252 if (pBstrDescription == NULL) 253 return E_INVALIDARG; 254 *pBstrDescription = ERRORINFO_SysAllocString(This->bstrDescription); 255 256 return S_OK; 258 257 } 259 258 260 259 static HRESULT WINAPI IErrorInfoImpl_GetHelpFile( 261 262 263 { 264 265 266 267 268 269 270 271 260 IErrorInfo* iface, 261 BSTR *pBstrHelpFile) 262 { 263 _ICOM_THIS_From_IErrorInfo(ErrorInfoImpl, iface); 264 265 TRACE("(%p)->(pBstrHelpFile=%p)\n",This, pBstrHelpFile); 266 if (pBstrHelpFile == NULL) 267 return E_INVALIDARG; 268 *pBstrHelpFile = ERRORINFO_SysAllocString(This->bstrHelpFile); 269 270 return S_OK; 272 271 } 273 272 274 273 static HRESULT WINAPI IErrorInfoImpl_GetHelpContext( 275 276 277 { 278 279 280 281 282 283 284 274 IErrorInfo* iface, 275 DWORD *pdwHelpContext) 276 { 277 _ICOM_THIS_From_IErrorInfo(ErrorInfoImpl, iface); 278 TRACE("(%p)->(pdwHelpContext=%p)\n",This, pdwHelpContext); 279 if (pdwHelpContext == NULL) 280 return E_INVALIDARG; 281 *pdwHelpContext = This->m_dwHelpContext; 282 283 return S_OK; 285 284 } 286 285 … … 291 290 IErrorInfoImpl_AddRef, 292 291 IErrorInfoImpl_Release, 293 292 294 293 IErrorInfoImpl_GetGUID, 295 294 IErrorInfoImpl_GetSource, … … 301 300 302 301 static HRESULT WINAPI ICreateErrorInfoImpl_QueryInterface( 303 304 305 306 { 307 308 309 302 ICreateErrorInfo* iface, 303 REFIID riid, 304 VOID** ppvoid) 305 { 306 _ICOM_THIS_From_ICreateErrorInfo(ErrorInfoImpl, iface); 307 TRACE("(%p)\n", This); 308 return IErrorInfo_QueryInterface(_IErrorInfo_(This), riid, ppvoid); 310 309 } 311 310 312 311 static ULONG WINAPI ICreateErrorInfoImpl_AddRef( 313 314 { 315 316 317 312 ICreateErrorInfo* iface) 313 { 314 _ICOM_THIS_From_ICreateErrorInfo(ErrorInfoImpl, iface); 315 TRACE("(%p)\n", This); 316 return IErrorInfo_AddRef(_IErrorInfo_(This)); 318 317 } 319 318 320 319 static ULONG WINAPI ICreateErrorInfoImpl_Release( 321 322 { 323 324 325 320 ICreateErrorInfo* iface) 321 { 322 _ICOM_THIS_From_ICreateErrorInfo(ErrorInfoImpl, iface); 323 TRACE("(%p)\n", This); 324 return IErrorInfo_Release(_IErrorInfo_(This)); 326 325 } 327 326 328 327 329 328 static HRESULT WINAPI ICreateErrorInfoImpl_SetGUID( 330 331 332 { 333 334 335 336 329 ICreateErrorInfo* iface, 330 REFGUID rguid) 331 { 332 _ICOM_THIS_From_ICreateErrorInfo(ErrorInfoImpl, iface); 333 TRACE("(%p)->(%s)\n", This, debugstr_guid(rguid)); 334 memcpy(&This->m_Guid, rguid, sizeof(GUID)); 335 return S_OK; 337 336 } 338 337 339 338 static HRESULT WINAPI ICreateErrorInfoImpl_SetSource( 340 341 342 { 343 344 345 346 347 348 349 339 ICreateErrorInfo* iface, 340 LPOLESTR szSource) 341 { 342 _ICOM_THIS_From_ICreateErrorInfo(ErrorInfoImpl, iface); 343 TRACE("(%p)\n",This); 344 if (This->bstrSource != NULL) 345 ERRORINFO_SysFreeString(This->bstrSource); 346 This->bstrSource = ERRORINFO_SysAllocString(szSource); 347 348 return S_OK; 350 349 } 351 350 352 351 static HRESULT WINAPI ICreateErrorInfoImpl_SetDescription( 353 354 355 { 356 357 358 359 360 361 362 352 ICreateErrorInfo* iface, 353 LPOLESTR szDescription) 354 { 355 _ICOM_THIS_From_ICreateErrorInfo(ErrorInfoImpl, iface); 356 TRACE("(%p)\n",This); 357 if (This->bstrDescription != NULL) 358 ERRORINFO_SysFreeString(This->bstrDescription); 359 This->bstrDescription = ERRORINFO_SysAllocString(szDescription); 360 361 return S_OK; 363 362 } 364 363 365 364 static HRESULT WINAPI ICreateErrorInfoImpl_SetHelpFile( 366 367 368 { 369 370 371 372 373 374 375 365 ICreateErrorInfo* iface, 366 LPOLESTR szHelpFile) 367 { 368 _ICOM_THIS_From_ICreateErrorInfo(ErrorInfoImpl, iface); 369 TRACE("(%p)\n",This); 370 if (This->bstrHelpFile != NULL) 371 ERRORINFO_SysFreeString(This->bstrHelpFile); 372 This->bstrHelpFile = ERRORINFO_SysAllocString(szHelpFile); 373 374 return S_OK; 376 375 } 377 376 378 377 static HRESULT WINAPI ICreateErrorInfoImpl_SetHelpContext( 379 380 381 { 382 383 384 385 386 378 ICreateErrorInfo* iface, 379 DWORD dwHelpContext) 380 { 381 _ICOM_THIS_From_ICreateErrorInfo(ErrorInfoImpl, iface); 382 TRACE("(%p)\n",This); 383 This->m_dwHelpContext = dwHelpContext; 384 385 return S_OK; 387 386 } 388 387 … … 402 401 403 402 static HRESULT WINAPI ISupportErrorInfoImpl_QueryInterface( 404 405 406 407 { 408 409 410 411 403 ISupportErrorInfo* iface, 404 REFIID riid, 405 VOID** ppvoid) 406 { 407 _ICOM_THIS_From_ISupportErrorInfo(ErrorInfoImpl, iface); 408 TRACE("(%p)\n", This); 409 410 return IErrorInfo_QueryInterface(_IErrorInfo_(This), riid, ppvoid); 412 411 } 413 412 414 413 static ULONG WINAPI ISupportErrorInfoImpl_AddRef( 415 416 { 417 418 419 414 ISupportErrorInfo* iface) 415 { 416 _ICOM_THIS_From_ISupportErrorInfo(ErrorInfoImpl, iface); 417 TRACE("(%p)\n", This); 418 return IErrorInfo_AddRef(_IErrorInfo_(This)); 420 419 } 421 420 422 421 static ULONG WINAPI ISupportErrorInfoImpl_Release( 423 424 { 425 426 427 422 ISupportErrorInfo* iface) 423 { 424 _ICOM_THIS_From_ISupportErrorInfo(ErrorInfoImpl, iface); 425 TRACE("(%p)\n", This); 426 return IErrorInfo_Release(_IErrorInfo_(This)); 428 427 } 429 428 430 429 431 430 static HRESULT WINAPI ISupportErrorInfoImpl_InterfaceSupportsErrorInfo( 432 433 434 { 435 436 437 431 ISupportErrorInfo* iface, 432 REFIID riid) 433 { 434 _ICOM_THIS_From_ISupportErrorInfo(ErrorInfoImpl, iface); 435 TRACE("(%p)->(%s)\n", This, debugstr_guid(riid)); 436 return (IsEqualIID(riid, &This->m_Guid)) ? S_OK : S_FALSE; 438 437 } 439 438 … … 449 448 }; 450 449 /*********************************************************************** 451 * 450 * CreateErrorInfo 452 451 */ 453 452 HRESULT WINAPI CreateErrorInfo(ICreateErrorInfo **pperrinfo) 454 453 { 455 456 457 458 459 460 461 462 463 454 IErrorInfo * pei; 455 HRESULT res; 456 TRACE("(%p): stub:\n", pperrinfo); 457 if(! pperrinfo ) return E_INVALIDARG; 458 if(!(pei=IErrorInfoImpl_Constructor()))return E_OUTOFMEMORY; 459 460 res = IErrorInfo_QueryInterface(pei, &IID_ICreateErrorInfo, (LPVOID*)pperrinfo); 461 IErrorInfo_Release(pei); 462 return res; 464 463 } 465 464 466 465 /*********************************************************************** 467 * 466 * GetErrorInfo 468 467 */ 469 468 HRESULT WINAPI GetErrorInfo(ULONG dwReserved, IErrorInfo **pperrinfo) 470 469 { 471 472 473 474 475 476 477 478 470 TRACE("(%ld, %p, %p): stub:\n", dwReserved, pperrinfo, NtCurrentTeb()->ErrorInfo); 471 472 if(! pperrinfo ) return E_INVALIDARG; 473 if(!(*pperrinfo = (IErrorInfo*)(NtCurrentTeb()->ErrorInfo))) return S_FALSE; 474 475 /* clear thread error state */ 476 NtCurrentTeb()->ErrorInfo = NULL; 477 return S_OK; 479 478 } 480 479 481 480 /*********************************************************************** 482 * 481 * SetErrorInfo 483 482 */ 484 483 HRESULT WINAPI SetErrorInfo(ULONG dwReserved, IErrorInfo *perrinfo) 485 484 { 486 487 488 489 490 491 492 493 494 495 496 497 } 485 IErrorInfo * pei; 486 TRACE("(%ld, %p): stub:\n", dwReserved, perrinfo); 487 488 /* release old errorinfo */ 489 pei = (IErrorInfo*)NtCurrentTeb()->ErrorInfo; 490 if(pei) IErrorInfo_Release(pei); 491 492 /* set to new value */ 493 NtCurrentTeb()->ErrorInfo = perrinfo; 494 if(perrinfo) IErrorInfo_AddRef(perrinfo); 495 return S_OK; 496 }
Note:
See TracChangeset
for help on using the changeset viewer.