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