Changeset 3243 for trunk/src/shell32/shlfolder.cpp
- Timestamp:
- Mar 26, 2000, 6:34:57 PM (25 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/shell32/shlfolder.cpp
r3217 r3243 1 /* $Id: shlfolder.cpp,v 1. 8 2000-03-24 17:17:27cbratschi Exp $ */1 /* $Id: shlfolder.cpp,v 1.9 2000-03-26 16:34:52 cbratschi Exp $ */ 2 2 /* 3 3 * Shell Folder stuff … … 8 8 * IShellFolder2 and related interfaces 9 9 * 10 * Corel WINE 20000324 level 10 11 */ 11 12 … … 36 37 DEFAULT_DEBUG_CHANNEL(shell) 37 38 38 #define MEM_DEBUG 1 39 /*************************************************************************** 40 * debughelper: print out the return adress 41 * helps especially to track down unbalanced AddRef/Release 42 */ 43 #define MEM_DEBUG 0 44 45 #if MEM_DEBUG 46 #define _CALL_TRACE TRACE("called from: 0x%08x\n", *( ((UINT*)&iface)-1 )); 47 #else 48 #define _CALL_TRACE 49 #endif 39 50 40 51 typedef struct … … 96 107 HRESULT hr = E_OUTOFMEMORY; 97 108 LPITEMIDLIST pidlOut, pidlTemp = NULL; 98 IShellFolder *psfChild ;109 IShellFolder *psfChild = NULL; 99 110 100 111 TRACE("(%p %p %s)\n",psf, pidlInOut? *pidlInOut: NULL, debugstr_w(szNext)); … … 103 114 /* get the shellfolder for the child pidl and let it analyse further */ 104 115 hr = IShellFolder_BindToObject(psf, *pidlInOut, NULL, &IID_IShellFolder, (LPVOID*)&psfChild); 105 116 dprintf(("C 1")); 106 117 if (psfChild) 107 { 118 { dprintf(("C 1a %d",psfChild/*,(psfChild)->fnParseDisplayName()*/)); 108 119 hr = IShellFolder_ParseDisplayName(psfChild, hwndOwner, NULL, szNext, pEaten, &pidlOut, pdwAttributes); 120 dprintf(("C 1b")); 109 121 IShellFolder_Release(psfChild); 110 122 dprintf(("C 2")); 111 123 pidlTemp = ILCombine(*pidlInOut, pidlOut); 112 124 dprintf(("C 3")); 113 125 if (pidlOut) 114 126 ILFree(pidlOut); 115 127 } 116 128 dprintf(("C 4")); 117 129 ILFree(*pidlInOut); 118 130 *pidlInOut = pidlTemp; … … 207 219 typedef struct 208 220 { 209 ICOM_VTABLE(I ShellFolder2)* lpvtbl;221 ICOM_VTABLE(IUnknown)* lpVtbl; 210 222 DWORD ref; 211 223 224 ICOM_VTABLE(IShellFolder2)* lpvtblShellFolder; 212 225 ICOM_VTABLE(IPersistFolder)* lpvtblPersistFolder; 213 226 ICOM_VTABLE(IDropTarget)* lpvtblDropTarget; 227 228 IUnknown *pUnkOuter; /* used for aggregation */ 214 229 215 230 CLSID* pclsid; … … 222 237 } IGenericSFImpl; 223 238 239 extern struct ICOM_VTABLE(IUnknown) unkvt; 224 240 extern struct ICOM_VTABLE(IShellFolder2) sfvt; 225 241 extern struct ICOM_VTABLE(IPersistFolder) psfvt; 226 extern struct ICOM_VTABLE(IDropTarget) dt 2vt;242 extern struct ICOM_VTABLE(IDropTarget) dtvt; 227 243 228 244 static IShellFolder * ISF_MyComputer_Constructor(void); 245 246 #define _IShellFolder2_Offset ((int)(&(((IGenericSFImpl*)0)->lpvtblShellFolder))) 247 #define _ICOM_THIS_From_IShellFolder2(class, name) class* This = (class*)(((char*)name)-_IShellFolder2_Offset); 229 248 230 249 #define _IPersistFolder_Offset ((int)(&(((IGenericSFImpl*)0)->lpvtblPersistFolder))) … … 233 252 #define _IDropTarget_Offset ((int)(&(((IGenericSFImpl*)0)->lpvtblDropTarget))) 234 253 #define _ICOM_THIS_From_IDropTarget(class, name) class* This = (class*)(((char*)name)-_IDropTarget_Offset); 254 255 /* 256 converts This to a interface pointer 257 */ 258 #define _IUnknown_(This) (IUnknown*)&(This->lpVtbl) 259 #define _IShellFolder_(This) (IShellFolder*)&(This->lpvtblShellFolder) 260 #define _IShellFolder2_(This) (IShellFolder2*)&(This->lpvtblShellFolder) 261 #define _IPersist_(This) (IPersist*)&(This->lpvtblPersistFolder) 262 #define _IPersistFolder_(This) (IPersistFolder*)&(This->lpvtblPersistFolder) 263 #define _IDropTarget_(This) (IDropTarget*)&(This->lpvtblDropTarget) 264 265 /************************************************************************** 266 * registers clipboardformat once 267 */ 268 static void SF_RegisterClipFmt (IGenericSFImpl * This) 269 { 270 TRACE("(%p)\n", This); 271 272 if (!This->cfShellIDList) 273 { 274 This->cfShellIDList = RegisterClipboardFormatA(CFSTR_SHELLIDLIST); 275 } 276 } 277 278 /************************************************************************** 279 * we need a seperate IUnknown to handle aggregation 280 * (inner IUnknown) 281 */ 282 static HRESULT WINAPI IUnknown_fnQueryInterface( 283 IUnknown * iface, 284 REFIID riid, 285 LPVOID *ppvObj) 286 { 287 ICOM_THIS(IGenericSFImpl, iface); 288 289 char xriid[50]; 290 WINE_StringFromCLSID((LPCLSID)riid,xriid); 291 292 _CALL_TRACE 293 TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj); 294 295 *ppvObj = NULL; 296 297 if(IsEqualIID(riid, &IID_IUnknown)) *ppvObj = _IUnknown_(This); 298 else if(IsEqualIID(riid, &IID_IShellFolder)) *ppvObj = _IShellFolder_(This); 299 else if(IsEqualIID(riid, &IID_IShellFolder2)) *ppvObj = _IShellFolder_(This); 300 else if(IsEqualIID(riid, &IID_IPersist)) *ppvObj = _IPersist_(This); 301 else if(IsEqualIID(riid, &IID_IPersistFolder)) *ppvObj = _IPersistFolder_(This); 302 else if(IsEqualIID(riid, &IID_IDropTarget)) 303 { 304 *ppvObj = _IDropTarget_(This); 305 SF_RegisterClipFmt(This); 306 } 307 308 if(*ppvObj) 309 { 310 IUnknown_AddRef((IUnknown*)(*ppvObj)); 311 TRACE("-- Interface = %p\n", *ppvObj); 312 return S_OK; 313 } 314 TRACE("-- Interface: E_NOINTERFACE\n"); 315 return E_NOINTERFACE; 316 } 317 318 static ULONG WINAPI IUnknown_fnAddRef(IUnknown * iface) 319 { 320 ICOM_THIS(IGenericSFImpl, iface); 321 322 _CALL_TRACE 323 TRACE("(%p)->(count=%lu)\n",This,This->ref); 324 325 shell32_ObjCount++; 326 return ++(This->ref); 327 } 328 329 static ULONG WINAPI IUnknown_fnRelease(IUnknown * iface) 330 { 331 ICOM_THIS(IGenericSFImpl, iface); 332 333 _CALL_TRACE 334 TRACE("(%p)->(count=%lu)\n",This,This->ref); 335 336 shell32_ObjCount--; 337 if (!--(This->ref)) 338 { 339 TRACE("-- destroying IShellFolder(%p)\n",This); 340 341 if (pdesktopfolder == _IShellFolder_(This)) 342 { 343 pdesktopfolder=NULL; 344 TRACE("-- destroyed IShellFolder(%p) was Desktopfolder\n",This); 345 } 346 if(This->absPidl) SHFree(This->absPidl); 347 if(This->sMyPath) SHFree(This->sMyPath); 348 HeapFree(GetProcessHeap(),0,This); 349 return 0; 350 } 351 return This->ref; 352 } 353 354 struct ICOM_VTABLE(IUnknown) unkvt = 355 { 356 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE 357 IUnknown_fnQueryInterface, 358 IUnknown_fnAddRef, 359 IUnknown_fnRelease, 360 }; 235 361 236 362 static shvheader GenericSFHeader [] = … … 245 371 246 372 /************************************************************************** 247 * registers clipboardformat once 248 */ 249 static void SF_RegisterClipFmt (IShellFolder2 * iface) 250 { 251 ICOM_THIS(IGenericSFImpl, iface); 252 253 TRACE("(%p)\n", This); 254 255 if (!This->cfShellIDList) 256 { 257 This->cfShellIDList = RegisterClipboardFormatA(CFSTR_SHELLIDLIST); 258 } 373 * IShellFolder_Constructor 374 * 375 * NOTES 376 * creating undocumented ShellFS_Folder as part of an aggregation 377 * {F3364BA0-65B9-11CE-A9BA-00AA004AE837} 378 * 379 * FIXME 380 * when pUnkOuter = 0 then rrid = IID_IShellFolder is returned 381 */ 382 HRESULT IFSFolder_Constructor( 383 IUnknown * pUnkOuter, 384 REFIID riid, 385 LPVOID * ppv) 386 { 387 IGenericSFImpl * sf; 388 char xriid[50]; 389 HRESULT hr = S_OK; 390 WINE_StringFromCLSID((LPCLSID)riid,xriid); 391 392 TRACE("unkOut=%p riid=%s\n",pUnkOuter, xriid); 393 394 if(pUnkOuter && ! IsEqualIID(riid, &IID_IUnknown)) 395 { 396 hr = CLASS_E_NOAGGREGATION; /* forbidden by definition */ 397 } 398 else 399 { 400 sf=(IGenericSFImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IGenericSFImpl)); 401 if (sf) 402 { 403 sf->ref=1; 404 ICOM_VTBL(sf)=&unkvt; 405 sf->lpvtblShellFolder=&sfvt; 406 sf->lpvtblPersistFolder=&psfvt; 407 sf->lpvtblDropTarget=&dtvt; 408 sf->pclsid = (CLSID*)&CLSID_SFFile; 409 sf->pUnkOuter = pUnkOuter ? pUnkOuter : _IUnknown_(sf); 410 *ppv = _IUnknown_(sf); 411 hr = S_OK; 412 shell32_ObjCount++; 413 } 414 else 415 { 416 hr = E_OUTOFMEMORY; 417 } 418 } 419 return hr; 259 420 } 260 421 … … 262 423 * IShellFolder_Constructor 263 424 * 425 * NOTES 426 * THIS points to the parent folder 264 427 */ 265 428 266 429 static IShellFolder * IShellFolder_Constructor( 267 IShellFolder * psf,430 IShellFolder2 * iface, 268 431 LPITEMIDLIST pidl) 269 432 { 270 433 IGenericSFImpl * sf; 271 IGenericSFImpl * sfParent = (IGenericSFImpl*) psf;272 434 DWORD dwSize=0; 435 436 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 273 437 274 438 sf=(IGenericSFImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IGenericSFImpl)); 275 439 sf->ref=1; 276 440 277 sf->lpvtbl=&sfvt; 441 ICOM_VTBL(sf)=&unkvt; 442 sf->lpvtblShellFolder=&sfvt; 278 443 sf->lpvtblPersistFolder=&psfvt; 279 sf->lpvtblDropTarget=&dt 2vt;444 sf->lpvtblDropTarget=&dtvt; 280 445 sf->pclsid = (CLSID*)&CLSID_SFFile; 281 sf->cfShellIDList=0; 282 sf->fAcceptFmt=FALSE; 283 284 TRACE("(%p)->(parent=%p, pidl=%p)\n",sf,sfParent, pidl); 446 sf->pUnkOuter = _IUnknown_(sf); 447 448 TRACE("(%p)->(parent=%p, pidl=%p)\n",sf,This, pidl); 285 449 pdump(pidl); 286 450 287 if(pidl ) /* do we have a pidl? */451 if(pidl && iface) /* do we have a pidl? */ 288 452 { 289 453 int len; 290 454 291 sf->absPidl = ILCombine( sfParent->absPidl, pidl); /* build a absolute pidl */455 sf->absPidl = ILCombine(This->absPidl, pidl); /* build a absolute pidl */ 292 456 293 457 if (!_ILIsSpecialFolder(pidl)) /* only file system paths */ 294 458 { 295 if( sfParent->sMyPath) /* get the size of the parents path */459 if(This->sMyPath) /* get the size of the parents path */ 296 460 { 297 dwSize += strlen( sfParent->sMyPath) ;298 TRACE("-- (%p)->(parent's path=%s)\n",sf, debugstr_a( sfParent->sMyPath));461 dwSize += strlen(This->sMyPath) ; 462 TRACE("-- (%p)->(parent's path=%s)\n",sf, debugstr_a(This->sMyPath)); 299 463 } 300 464 … … 305 469 *(sf->sMyPath)=0x00; 306 470 307 if( sfParent->sMyPath) /* if the parent has a path, get it*/471 if(This->sMyPath) /* if the parent has a path, get it*/ 308 472 { 309 strcpy(sf->sMyPath, sfParent->sMyPath);473 strcpy(sf->sMyPath, This->sMyPath); 310 474 PathAddBackslashA (sf->sMyPath); 311 475 } … … 321 485 322 486 shell32_ObjCount++; 323 return (IShellFolder *)sf;487 return _IShellFolder_(sf); 324 488 } 325 489 /************************************************************************** … … 335 499 LPVOID *ppvObj) 336 500 { 337 ICOM_THIS(IGenericSFImpl, iface); 338 339 char xriid[50]; 340 WINE_StringFromCLSID((LPCLSID)riid,xriid); 341 TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj); 342 343 *ppvObj = NULL; 344 345 if(IsEqualIID(riid, &IID_IUnknown)) 346 { *ppvObj = This; 347 } 348 else if(IsEqualIID(riid, &IID_IShellFolder)) 349 { 350 *ppvObj = (IShellFolder*)This; 351 } 352 else if(IsEqualIID(riid, &IID_IShellFolder2)) 353 { 354 *ppvObj = (IShellFolder2*)This; 355 } 356 else if(IsEqualIID(riid, &IID_IPersist)) 357 { 358 *ppvObj = (IPersistFolder*)&(This->lpvtblPersistFolder); 359 } 360 else if(IsEqualIID(riid, &IID_IPersistFolder)) 361 { 362 *ppvObj = (IPersistFolder*)&(This->lpvtblPersistFolder); 363 } 364 else if(IsEqualIID(riid, &IID_IDropTarget)) 365 { 366 *ppvObj = (IDropTarget*)&(This->lpvtblDropTarget); 367 SF_RegisterClipFmt((IShellFolder2*)This); 368 } 369 370 if(*ppvObj) 371 { 372 IUnknown_AddRef((IUnknown*)(*ppvObj)); 373 TRACE("-- Interface = %p\n", *ppvObj); 374 return S_OK; 375 } 376 TRACE("-- Interface: E_NOINTERFACE\n"); 377 return E_NOINTERFACE; 501 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 502 503 char xriid[50]; 504 WINE_StringFromCLSID((LPCLSID)riid,xriid); 505 _CALL_TRACE 506 TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj); 507 508 return IUnknown_QueryInterface(This->pUnkOuter, riid, ppvObj); 378 509 } 379 510 … … 384 515 static ULONG WINAPI IShellFolder_fnAddRef(IShellFolder2 * iface) 385 516 { 386 ICOM_THIS(IGenericSFImpl, iface); 387 388 #ifdef MEM_DEBUG 389 TRACE("called from: 0x%08x\n", *( ((UINT*)&iface)-1 )); 390 #endif 391 TRACE("(%p)->(count=%lu)\n",This,This->ref); 392 393 shell32_ObjCount++; 394 return ++(This->ref); 517 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 518 519 _CALL_TRACE 520 TRACE("(%p)->(count=%lu)\n",This,This->ref); 521 522 return IUnknown_AddRef(This->pUnkOuter); 395 523 } 396 524 … … 400 528 static ULONG WINAPI IShellFolder_fnRelease(IShellFolder2 * iface) 401 529 { 402 ICOM_THIS(IGenericSFImpl, iface); 403 404 #ifdef MEM_DEBUG 405 TRACE("called from: 0x%08x\n", *( ((UINT*)&iface)-1 )); 406 #endif 407 TRACE("(%p)->(count=%lu)\n",This,This->ref); 408 409 shell32_ObjCount--; 410 if (!--(This->ref)) 411 { TRACE("-- destroying IShellFolder(%p)\n",This); 412 413 if (pdesktopfolder == (IShellFolder*)iface) 414 { pdesktopfolder=NULL; 415 TRACE("-- destroyed IShellFolder(%p) was Desktopfolder\n",This); 416 } 417 if(This->absPidl) 418 { SHFree(This->absPidl); 419 } 420 if(This->sMyPath) 421 { SHFree(This->sMyPath); 422 } 423 424 HeapFree(GetProcessHeap(),0,This); 425 426 return 0; 427 } 428 return This->ref; 530 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 531 532 _CALL_TRACE 533 TRACE("(%p)->(count=%lu)\n",This,This->ref); 534 535 return IUnknown_Release(This->pUnkOuter); 429 536 } 430 537 /************************************************************************** … … 459 566 DWORD *pdwAttributes) 460 567 { 461 ICOM_THIS(IGenericSFImpl, iface);568 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 462 569 463 570 HRESULT hr = E_OUTOFMEMORY; … … 494 601 if (szNext && *szNext) 495 602 { 496 hr = SHELL32_ParseNextElement(hwndOwner, (IShellFolder2*)This, &pidlTemp, (LPOLESTR)szNext, pchEaten, pdwAttributes);603 hr = SHELL32_ParseNextElement(hwndOwner, iface, &pidlTemp, (LPOLESTR)szNext, pchEaten, pdwAttributes); 497 604 } 498 605 else … … 523 630 LPENUMIDLIST* ppEnumIDList) 524 631 { 525 ICOM_THIS(IGenericSFImpl, iface); 526 527 TRACE("(%p)->(HWND=0x%08x flags=0x%08lx pplist=%p)\n",This,hwndOwner,dwFlags,ppEnumIDList); 528 529 *ppEnumIDList = NULL; 530 *ppEnumIDList = IEnumIDList_Constructor (This->sMyPath, dwFlags, EIDL_FILE); 531 532 TRACE("-- (%p)->(new ID List: %p)\n",This,*ppEnumIDList); 533 534 if(!*ppEnumIDList) return E_OUTOFMEMORY; 535 536 return S_OK; 632 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 633 634 TRACE("(%p)->(HWND=0x%08x flags=0x%08lx pplist=%p)\n",This,hwndOwner,dwFlags,ppEnumIDList); 635 636 *ppEnumIDList = NULL; 637 638 if (This->sMyPath) 639 *ppEnumIDList = IEnumIDList_Constructor (This->sMyPath, dwFlags, EIDL_FILE); 640 else 641 { 642 /* if This->sMyPath is NULL, we will start enumerating objects 643 at MyComputer level */ 644 *ppEnumIDList = IEnumIDList_Constructor (NULL, dwFlags, EIDL_MYCOMP); 645 } 646 647 648 TRACE("-- (%p)->(new ID List: %p)\n",This,*ppEnumIDList); 649 650 if(!*ppEnumIDList) return E_OUTOFMEMORY; 651 652 return S_OK; 537 653 } 538 654 … … 548 664 LPBC pbcReserved, REFIID riid, LPVOID * ppvOut) 549 665 { 550 ICOM_THIS(IGenericSFImpl, iface);666 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 551 667 GUID const * iid; 552 668 char xriid[50]; … … 559 675 TRACE("(%p)->(pidl=%p,%p,\n\tIID:\t%s,%p)\n",This,pidl,pbcReserved,xriid,ppvOut); 560 676 561 if(!p idl || !ppvOut) return E_INVALIDARG;677 if(!ppvOut) return E_INVALIDARG; 562 678 563 679 *ppvOut = NULL; 680 681 if (!pidl) return E_INVALIDARG; 564 682 565 683 iid = _ILGetGUIDPointer(pidl); … … 583 701 { 584 702 LPITEMIDLIST pidltemp = ILCloneFirst(pidl); 585 pShellFolder = IShellFolder_Constructor( (IShellFolder*)This, pidltemp);703 pShellFolder = IShellFolder_Constructor(iface, pidltemp); 586 704 ILFree(pidltemp); 587 705 } … … 618 736 LPVOID *ppvOut) 619 737 { 620 ICOM_THIS(IGenericSFImpl, iface);738 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 621 739 622 740 char xriid[50]; … … 651 769 LPCITEMIDLIST pidl2) 652 770 { 653 ICOM_THIS(IGenericSFImpl, iface);771 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 654 772 655 773 CHAR szTemp1[MAX_PATH]; … … 706 824 pidl2 = ILGetNext(pidl2); 707 825 708 hr = IShellFolder_BindToObject( (IShellFolder*)This, pidlTemp, NULL, &IID_IShellFolder, (LPVOID*)&psf);826 hr = IShellFolder_BindToObject(iface, pidlTemp, NULL, &IID_IShellFolder, (LPVOID*)&psf); 709 827 if (SUCCEEDED(hr)) 710 828 { … … 737 855 HWND hwndOwner, REFIID riid, LPVOID *ppvOut) 738 856 { 739 ICOM_THIS(IGenericSFImpl, iface);857 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 740 858 741 859 LPSHELLVIEW pShellView; … … 752 870 if(IsEqualIID(riid, &IID_IDropTarget)) 753 871 { 754 hr = IShellFolder_QueryInterface( (IShellFolder*)This, &IID_IDropTarget, ppvOut);872 hr = IShellFolder_QueryInterface(iface, &IID_IDropTarget, ppvOut); 755 873 } 756 874 else if(IsEqualIID(riid, &IID_IContextMenu)) … … 761 879 else if(IsEqualIID(riid, &IID_IShellView)) 762 880 { 763 pShellView = IShellView_Constructor((IShellFolder *) This);881 pShellView = IShellView_Constructor((IShellFolder*)iface); 764 882 if(pShellView) 765 883 { … … 784 902 static HRESULT WINAPI IShellFolder_fnGetAttributesOf(IShellFolder2 * iface,UINT cidl,LPCITEMIDLIST *apidl,DWORD *rgfInOut) 785 903 { 786 ICOM_THIS(IGenericSFImpl, iface);904 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 787 905 788 906 HRESULT hr = S_OK; 789 907 790 908 TRACE("(%p)->(cidl=%d apidl=%p mask=0x%08lx)\n",This,cidl,apidl,*rgfInOut); 909 910 if( !cidl && !apidl && rgfInOut ) 911 { // return default 912 *rgfInOut = SFGAO_CAPABILITYMASK|SFGAO_FILESYSTEM; 913 return hr; 914 } 915 791 916 792 917 if ( (!cidl) || (!apidl) || (!rgfInOut)) … … 846 971 LPVOID * ppvOut) 847 972 { 848 ICOM_THIS(IGenericSFImpl, iface);973 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 849 974 850 975 char xclsid[50]; … … 864 989 if(IsEqualIID(riid, &IID_IContextMenu) && (cidl >= 1)) 865 990 { 866 pObj = (LPUNKNOWN)IContextMenu_Constructor((IShellFolder *) This, This->absPidl, apidl, cidl);991 pObj = (LPUNKNOWN)IContextMenu_Constructor((IShellFolder *)iface, This->absPidl, apidl, cidl); 867 992 hr = S_OK; 868 993 } … … 881 1006 else if (IsEqualIID(riid, &IID_IDropTarget) && (cidl >= 1)) 882 1007 { 883 hr = IShellFolder_QueryInterface( (IShellFolder*)This, &IID_IDropTarget, (LPVOID*)&pObj);1008 hr = IShellFolder_QueryInterface(iface, &IID_IDropTarget, (LPVOID*)&pObj); 884 1009 } 885 1010 else … … 918 1043 LPSTRRET strRet) 919 1044 { 920 ICOM_THIS(IGenericSFImpl, iface);1045 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 921 1046 922 1047 CHAR szPath[MAX_PATH]= ""; … … 955 1080 len = strlen(szPath); 956 1081 957 if (!SUCCEEDED(SHELL32_GetDisplayNameOfChild( (IShellFolder2*)This, pidl, dwFlags, szPath + len, MAX_PATH - len)))1082 if (!SUCCEEDED(SHELL32_GetDisplayNameOfChild(iface, pidl, dwFlags, szPath + len, MAX_PATH - len))) 958 1083 return E_OUTOFMEMORY; 959 1084 } … … 985 1110 LPITEMIDLIST *pPidlOut) 986 1111 { 987 ICOM_THIS(IGenericSFImpl, iface);1112 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 988 1113 989 1114 FIXME("(%p)->(%u,pidl=%p,%s,%lu,%p),stub!\n", … … 998 1123 static HRESULT WINAPI IShellFolder_fnGetFolderPath(IShellFolder2 * iface, LPSTR lpszOut, DWORD dwOutSize) 999 1124 { 1000 ICOM_THIS(IGenericSFImpl, iface);1125 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 1001 1126 1002 1127 TRACE("(%p)->(%p %lu)\n",This, lpszOut, dwOutSize); … … 1018 1143 GUID *pguid) 1019 1144 { 1020 ICOM_THIS(IGenericSFImpl, iface);1021 TRACE("(%p)\n",This);1145 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 1146 FIXME("(%p)\n",This); 1022 1147 return E_NOTIMPL; 1023 1148 } … … 1026 1151 IEnumExtraSearch **ppenum) 1027 1152 { 1028 ICOM_THIS(IGenericSFImpl, iface);1029 TRACE("(%p)\n",This);1153 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 1154 FIXME("(%p)\n",This); 1030 1155 return E_NOTIMPL; 1031 1156 } … … 1036 1161 ULONG *pDisplay) 1037 1162 { 1038 ICOM_THIS(IGenericSFImpl, iface);1163 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 1039 1164 1040 1165 TRACE("(%p)\n",This); … … 1050 1175 DWORD *pcsFlags) 1051 1176 { 1052 ICOM_THIS(IGenericSFImpl, iface);1177 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 1053 1178 1054 1179 TRACE("(%p)\n",This); … … 1066 1191 VARIANT *pv) 1067 1192 { 1068 ICOM_THIS(IGenericSFImpl, iface);1069 TRACE("(%p)\n",This);1193 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 1194 FIXME("(%p)\n",This); 1070 1195 return E_NOTIMPL; 1071 1196 } … … 1076 1201 SHELLDETAILS *psd) 1077 1202 { 1078 ICOM_THIS(IGenericSFImpl, iface);1203 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 1079 1204 HRESULT hr = E_FAIL; 1080 1205 … … 1110 1235 break; 1111 1236 case 4: /* attributes */ 1112 _ILGet AttributeStr(pidl, psd->str.u.cStr, MAX_PATH);1237 _ILGetFileAttributes(pidl, psd->str.u.cStr, MAX_PATH); 1113 1238 break; 1114 1239 } … … 1124 1249 SHCOLUMNID *pscid) 1125 1250 { 1126 ICOM_THIS(IGenericSFImpl, iface);1127 TRACE("(%p)\n",This);1251 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 1252 FIXME("(%p)\n",This); 1128 1253 return E_NOTIMPL; 1129 1254 } … … 1183 1308 sf=(IGenericSFImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IGenericSFImpl)); 1184 1309 sf->ref=1; 1185 sf->lpvtbl=&sfdvt; 1310 ICOM_VTBL(sf)=&unkvt; 1311 sf->lpvtblShellFolder=&sfdvt; 1186 1312 sf->absPidl=_ILCreateDesktop(); /* my qualified pidl */ 1313 sf->pUnkOuter = (IUnknown *) &sf->lpVtbl; 1187 1314 1188 1315 TRACE("(%p)\n",sf); 1189 1316 1190 1317 shell32_ObjCount++; 1191 return (IShellFolder *)sf;1318 return _IShellFolder_(sf); 1192 1319 } 1193 1320 … … 1202 1329 LPVOID *ppvObj) 1203 1330 { 1204 ICOM_THIS(IGenericSFImpl, iface); 1205 1206 char xriid[50]; 1207 WINE_StringFromCLSID((LPCLSID)riid,xriid); 1208 TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj); 1209 1210 *ppvObj = NULL; 1211 1212 if(IsEqualIID(riid, &IID_IUnknown)) /*IUnknown*/ 1213 { *ppvObj = This; 1214 } 1215 else if(IsEqualIID(riid, &IID_IShellFolder)) /*IShellFolder*/ 1216 { *ppvObj = (IShellFolder*)This; 1217 } 1218 else if(IsEqualIID(riid, &IID_IShellFolder2)) /*IShellFolder2*/ 1219 { *ppvObj = (IShellFolder2*)This; 1220 } 1221 1222 if(*ppvObj) 1223 { 1224 IUnknown_AddRef((IUnknown*)(*ppvObj)); 1225 TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj); 1226 return S_OK; 1227 } 1228 TRACE("-- Interface: E_NOINTERFACE\n"); 1229 return E_NOINTERFACE; 1331 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 1332 1333 char xriid[50]; 1334 WINE_StringFromCLSID((LPCLSID)riid,xriid); 1335 TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj); 1336 1337 *ppvObj = NULL; 1338 1339 if(IsEqualIID(riid, &IID_IUnknown)) /*IUnknown*/ 1340 { 1341 *ppvObj = _IUnknown_(This); 1342 } 1343 else if(IsEqualIID(riid, &IID_IShellFolder)) /*IShellFolder*/ 1344 { 1345 *ppvObj = _IShellFolder_(This); 1346 } 1347 else if(IsEqualIID(riid, &IID_IShellFolder2)) /*IShellFolder2*/ 1348 { 1349 *ppvObj = _IShellFolder_(This); 1350 } 1351 1352 if(*ppvObj) 1353 { 1354 IUnknown_AddRef((IUnknown*)(*ppvObj)); 1355 TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj); 1356 return S_OK; 1357 } 1358 TRACE("-- Interface: E_NOINTERFACE\n"); 1359 return E_NOINTERFACE; 1230 1360 } 1231 1361 … … 1246 1376 DWORD *pdwAttributes) 1247 1377 { 1248 ICOM_THIS(IGenericSFImpl, iface);1378 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 1249 1379 1250 1380 LPCWSTR szNext=NULL; … … 1265 1395 if (szNext && *szNext) 1266 1396 { 1267 hr = SHELL32_ParseNextElement(hwndOwner, (IShellFolder2*)This, &pidlTemp, (LPOLESTR)szNext, pchEaten, pdwAttributes);1397 hr = SHELL32_ParseNextElement(hwndOwner,iface, &pidlTemp, (LPOLESTR)szNext, pchEaten, pdwAttributes); 1268 1398 } 1269 1399 else … … 1288 1418 LPENUMIDLIST* ppEnumIDList) 1289 1419 { 1290 ICOM_THIS(IGenericSFImpl, iface);1420 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 1291 1421 1292 1422 TRACE("(%p)->(HWND=0x%08x flags=0x%08lx pplist=%p)\n",This,hwndOwner,dwFlags,ppEnumIDList); … … 1308 1438 LPBC pbcReserved, REFIID riid, LPVOID * ppvOut) 1309 1439 { 1310 ICOM_THIS(IGenericSFImpl, iface);1440 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 1311 1441 GUID const * clsid; 1312 1442 char xriid[50]; … … 1322 1452 if (clsid) 1323 1453 { 1324 if ( IsEqualIID(clsid, & IID_MyComputer))1454 if ( IsEqualIID(clsid, &CLSID_MyComputer)) 1325 1455 { 1326 1456 pShellFolder = ISF_MyComputer_Constructor(); … … 1338 1468 { 1339 1469 /* file system folder on the desktop */ 1340 LPITEMIDLIST pidltemp = ILCloneFirst(pidl); 1341 pShellFolder = IShellFolder_Constructor((IShellFolder*)This, pidltemp); 1342 ILFree(pidltemp); 1470 LPITEMIDLIST deskpidl, firstpidl, completepidl; 1471 IPersistFolder * ppf; 1472 1473 /* combine pidls */ 1474 SHGetSpecialFolderLocation(0, CSIDL_DESKTOPDIRECTORY, &deskpidl); 1475 firstpidl = ILCloneFirst(pidl); 1476 completepidl = ILCombine(deskpidl, firstpidl); 1477 1478 pShellFolder = IShellFolder_Constructor(NULL, NULL); 1479 if (SUCCEEDED(IShellFolder_QueryInterface(pShellFolder, &IID_IPersistFolder, (LPVOID*)&ppf))) 1480 { 1481 IPersistFolder_Initialize(ppf, completepidl); 1482 IPersistFolder_Release(ppf); 1483 } 1484 ILFree(completepidl); 1485 ILFree(deskpidl); 1486 ILFree(firstpidl); 1343 1487 } 1344 1488 … … 1365 1509 HWND hwndOwner, REFIID riid, LPVOID *ppvOut) 1366 1510 { 1367 ICOM_THIS(IGenericSFImpl, iface);1511 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 1368 1512 1369 1513 LPSHELLVIEW pShellView; … … 1390 1534 else if(IsEqualIID(riid, &IID_IShellView)) 1391 1535 { 1392 pShellView = IShellView_Constructor((IShellFolder *) This);1536 pShellView = IShellView_Constructor((IShellFolder*)iface); 1393 1537 if(pShellView) 1394 1538 { … … 1407 1551 static HRESULT WINAPI ISF_Desktop_fnGetAttributesOf(IShellFolder2 * iface,UINT cidl,LPCITEMIDLIST *apidl,DWORD *rgfInOut) 1408 1552 { 1409 ICOM_THIS(IGenericSFImpl, iface);1553 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 1410 1554 1411 1555 GUID const * clsid; … … 1425 1569 if (clsid) 1426 1570 { 1427 if (IsEqualIID(clsid, & IID_MyComputer))1571 if (IsEqualIID(clsid, &CLSID_MyComputer)) 1428 1572 { 1429 1573 *rgfInOut &= 0xb0000154; … … 1473 1617 LPSTRRET strRet) 1474 1618 { 1475 ICOM_THIS(IGenericSFImpl, iface);1619 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 1476 1620 1477 1621 CHAR szPath[MAX_PATH]= ""; … … 1492 1636 else 1493 1637 { 1494 if (!SUCCEEDED(SHELL32_GetDisplayNameOfChild( (IShellFolder2*)This, pidl, dwFlags, szPath, MAX_PATH)))1638 if (!SUCCEEDED(SHELL32_GetDisplayNameOfChild(iface, pidl, dwFlags, szPath, MAX_PATH))) 1495 1639 return E_OUTOFMEMORY; 1496 1640 } … … 1507 1651 GUID *pguid) 1508 1652 { 1509 ICOM_THIS(IGenericSFImpl, iface);1653 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 1510 1654 FIXME("(%p)\n",This); 1511 1655 return E_NOTIMPL; … … 1515 1659 IEnumExtraSearch **ppenum) 1516 1660 { 1517 ICOM_THIS(IGenericSFImpl, iface);1661 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 1518 1662 FIXME("(%p)\n",This); 1519 1663 return E_NOTIMPL; … … 1525 1669 ULONG *pDisplay) 1526 1670 { 1527 ICOM_THIS(IGenericSFImpl, iface);1671 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 1528 1672 1529 1673 TRACE("(%p)\n",This); … … 1539 1683 DWORD *pcsFlags) 1540 1684 { 1541 ICOM_THIS(IGenericSFImpl, iface);1685 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 1542 1686 1543 1687 TRACE("(%p)\n",This); … … 1555 1699 VARIANT *pv) 1556 1700 { 1557 ICOM_THIS(IGenericSFImpl, iface);1701 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 1558 1702 FIXME("(%p)\n",This); 1559 1703 … … 1566 1710 SHELLDETAILS *psd) 1567 1711 { 1568 ICOM_THIS(IGenericSFImpl, iface);1712 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 1569 1713 HRESULT hr = E_FAIL;; 1570 1714 … … 1599 1743 break; 1600 1744 case 4: /* attributes */ 1601 _ILGet AttributeStr(pidl, psd->str.u.cStr, MAX_PATH);1745 _ILGetFileAttributes(pidl, psd->str.u.cStr, MAX_PATH); 1602 1746 break; 1603 1747 } … … 1613 1757 SHCOLUMNID *pscid) 1614 1758 { 1615 ICOM_THIS(IGenericSFImpl, iface);1759 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 1616 1760 FIXME("(%p)\n",This); 1617 1761 return E_NOTIMPL; … … 1671 1815 sf->ref=1; 1672 1816 1673 sf->lpvtbl = &sfmcvt; 1817 ICOM_VTBL(sf)=&unkvt; 1818 sf->lpvtblShellFolder=&sfmcvt; 1674 1819 sf->lpvtblPersistFolder = &psfvt; 1675 1820 sf->pclsid = (CLSID*)&CLSID_SFMyComp; 1676 1821 sf->absPidl=_ILCreateMyComputer(); /* my qualified pidl */ 1822 sf->pUnkOuter = (IUnknown *) &sf->lpVtbl; 1677 1823 1678 1824 TRACE("(%p)\n",sf); 1679 1825 1680 1826 shell32_ObjCount++; 1681 return (IShellFolder *)sf;1827 return _IShellFolder_(sf); 1682 1828 } 1683 1829 … … 1694 1840 DWORD *pdwAttributes) 1695 1841 { 1696 ICOM_THIS(IGenericSFImpl, iface);1842 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 1697 1843 1698 1844 HRESULT hr = E_OUTOFMEMORY; … … 1717 1863 if (szNext && *szNext) 1718 1864 { 1719 hr = SHELL32_ParseNextElement(hwndOwner, (IShellFolder2*)This, &pidlTemp, (LPOLESTR)szNext, pchEaten, pdwAttributes);1865 hr = SHELL32_ParseNextElement(hwndOwner,iface, &pidlTemp, (LPOLESTR)szNext, pchEaten, pdwAttributes); 1720 1866 } 1721 1867 else … … 1740 1886 LPENUMIDLIST* ppEnumIDList) 1741 1887 { 1742 ICOM_THIS(IGenericSFImpl, iface);1888 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 1743 1889 1744 1890 TRACE("(%p)->(HWND=0x%08x flags=0x%08lx pplist=%p)\n",This,hwndOwner,dwFlags,ppEnumIDList); … … 1760 1906 LPBC pbcReserved, REFIID riid, LPVOID * ppvOut) 1761 1907 { 1762 ICOM_THIS(IGenericSFImpl, iface);1908 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 1763 1909 GUID const * clsid; 1764 1910 char xriid[50]; … … 1770 1916 TRACE("(%p)->(pidl=%p,%p,\n\tIID:\t%s,%p)\n",This,pidl,pbcReserved,xriid,ppvOut); 1771 1917 1772 if(!p idl || !ppvOut) return E_INVALIDARG;1918 if(!ppvOut) return E_INVALIDARG; 1773 1919 1774 1920 *ppvOut = NULL; 1775 1921 1776 if ((clsid=_ILGetGUIDPointer(pidl)) && !IsEqualIID(clsid, &IID_MyComputer)) 1922 if (!pidl) return E_INVALIDARG; 1923 1924 if ((clsid=_ILGetGUIDPointer(pidl)) && !IsEqualIID(clsid, &CLSID_MyComputer)) 1777 1925 { 1778 1926 if (!SUCCEEDED(SHELL32_CoCreateInitSF (This->absPidl, pidl, clsid, riid, (LPVOID*)&pShellFolder))) … … 1786 1934 1787 1935 pidltemp = ILCloneFirst(pidl); 1788 pShellFolder = IShellFolder_Constructor( (IShellFolder*)This, pidltemp);1936 pShellFolder = IShellFolder_Constructor(iface, pidltemp); 1789 1937 ILFree(pidltemp); 1790 1938 } … … 1812 1960 HWND hwndOwner, REFIID riid, LPVOID *ppvOut) 1813 1961 { 1814 ICOM_THIS(IGenericSFImpl, iface);1962 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 1815 1963 1816 1964 LPSHELLVIEW pShellView; … … 1837 1985 else if(IsEqualIID(riid, &IID_IShellView)) 1838 1986 { 1839 pShellView = IShellView_Constructor((IShellFolder *) This);1987 pShellView = IShellView_Constructor((IShellFolder*)iface); 1840 1988 if(pShellView) 1841 1989 { … … 1854 2002 static HRESULT WINAPI ISF_MyComputer_fnGetAttributesOf(IShellFolder2 * iface,UINT cidl,LPCITEMIDLIST *apidl,DWORD *rgfInOut) 1855 2003 { 1856 ICOM_THIS(IGenericSFImpl, iface);2004 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 1857 2005 1858 2006 GUID const * clsid; … … 1910 2058 LPSTRRET strRet) 1911 2059 { 1912 ICOM_THIS(IGenericSFImpl, iface);2060 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 1913 2061 1914 2062 char szPath[MAX_PATH], szDrive[18]; … … 1962 2110 len = strlen(szPath); 1963 2111 1964 if (!SUCCEEDED(SHELL32_GetDisplayNameOfChild( (IShellFolder2*)This, pidl, dwFlags | SHGDN_FORPARSING, szPath + len, MAX_PATH - len)))2112 if (!SUCCEEDED(SHELL32_GetDisplayNameOfChild(iface, pidl, dwFlags | SHGDN_FORPARSING, szPath + len, MAX_PATH - len))) 1965 2113 return E_OUTOFMEMORY; 1966 2114 } … … 1977 2125 GUID *pguid) 1978 2126 { 1979 ICOM_THIS(IGenericSFImpl, iface);2127 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 1980 2128 FIXME("(%p)\n",This); 1981 2129 return E_NOTIMPL; … … 1985 2133 IEnumExtraSearch **ppenum) 1986 2134 { 1987 ICOM_THIS(IGenericSFImpl, iface);2135 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 1988 2136 FIXME("(%p)\n",This); 1989 2137 return E_NOTIMPL; … … 1995 2143 ULONG *pDisplay) 1996 2144 { 1997 ICOM_THIS(IGenericSFImpl, iface);2145 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 1998 2146 1999 2147 TRACE("(%p)\n",This); … … 2009 2157 DWORD *pcsFlags) 2010 2158 { 2011 ICOM_THIS(IGenericSFImpl, iface);2159 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 2012 2160 2013 2161 TRACE("(%p)\n",This); … … 2025 2173 VARIANT *pv) 2026 2174 { 2027 ICOM_THIS(IGenericSFImpl, iface);2175 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 2028 2176 FIXME("(%p)\n",This); 2029 2177 … … 2038 2186 SHELLDETAILS *psd) 2039 2187 { 2040 ICOM_THIS(IGenericSFImpl, iface);2188 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 2041 2189 HRESULT hr; 2042 2190 … … 2073 2221 _ILSimpleGetText(pidl, szPath, MAX_PATH); 2074 2222 GetDiskFreeSpaceExA(szPath, NULL, &ulBytes, NULL); 2223 //CB: WINE uses ulBytes.s.LowPart 2075 2224 StrFormatByteSizeA(ulBytes.LowPart, psd->str.u.cStr, MAX_PATH); 2076 2225 } … … 2081 2230 _ILSimpleGetText(pidl, szPath, MAX_PATH); 2082 2231 GetDiskFreeSpaceExA(szPath, &ulBytes, NULL, NULL); 2232 //CB: WINE uses ulBytes.s.LowPart 2083 2233 StrFormatByteSizeA(ulBytes.LowPart, psd->str.u.cStr, MAX_PATH); 2084 2234 } … … 2095 2245 SHCOLUMNID *pscid) 2096 2246 { 2097 ICOM_THIS(IGenericSFImpl, iface);2247 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 2098 2248 FIXME("(%p)\n",This); 2099 2249 return E_NOTIMPL; … … 2141 2291 TRACE("(%p)\n", This); 2142 2292 2143 return I ShellFolder_QueryInterface((IShellFolder*)This, iid, ppvObj);2293 return IUnknown_QueryInterface(This->pUnkOuter, iid, ppvObj); 2144 2294 } 2145 2295 … … 2151 2301 IPersistFolder * iface) 2152 2302 { 2153 _ICOM_THIS_From_IPersistFolder(IShellFolder, iface);2154 2155 2156 2157 return IShellFolder_AddRef((IShellFolder*)This);2303 _ICOM_THIS_From_IPersistFolder(IGenericSFImpl, iface); 2304 2305 TRACE("(%p)\n", This); 2306 2307 return IUnknown_AddRef(This->pUnkOuter); 2158 2308 } 2159 2309 … … 2169 2319 TRACE("(%p)\n", This); 2170 2320 2171 return I ShellFolder_Release((IShellFolder*)This);2321 return IUnknown_Release(This->pUnkOuter); 2172 2322 } 2173 2323 … … 2199 2349 LPCITEMIDLIST pidl) 2200 2350 { 2351 char sTemp[MAX_PATH]; 2201 2352 _ICOM_THIS_From_IPersistFolder(IGenericSFImpl, iface); 2202 2353 2203 TRACE("(%p)\n", This); 2204 2205 if(This->absPidl) 2206 { 2207 SHFree(This->absPidl); 2208 This->absPidl = NULL; 2209 } 2210 This->absPidl = ILClone(pidl); 2211 return S_OK; 2354 TRACE("(%p)->(%p)\n", This, pidl); 2355 2356 /* free the old stuff */ 2357 if(This->absPidl) 2358 { 2359 SHFree(This->absPidl); 2360 This->absPidl = NULL; 2361 } 2362 if(This->sMyPath) 2363 { 2364 SHFree(This->sMyPath); 2365 This->sMyPath = NULL; 2366 } 2367 2368 /* set my pidl */ 2369 This->absPidl = ILClone(pidl); 2370 2371 /* set my path */ 2372 if (SHGetPathFromIDListA(pidl, sTemp)) 2373 { 2374 This->sMyPath = (CHAR*)SHAlloc(strlen(sTemp+1)); 2375 strcpy(This->sMyPath, sTemp); 2376 } 2377 2378 TRACE("--(%p)->(%s)\n", This, This->sMyPath); 2379 2380 return S_OK; 2212 2381 } 2213 2382 … … 2258 2427 TRACE("(%p)\n", This); 2259 2428 2260 return I ShellFolder_QueryInterface((IShellFolder*)This, riid, ppvObj);2429 return IUnknown_QueryInterface(This->pUnkOuter, riid, ppvObj); 2261 2430 } 2262 2431 … … 2267 2436 TRACE("(%p)\n", This); 2268 2437 2269 return I ShellFolder_AddRef((IShellFolder*)This);2438 return IUnknown_AddRef(This->pUnkOuter); 2270 2439 } 2271 2440 … … 2276 2445 TRACE("(%p)\n", This); 2277 2446 2278 return I ShellFolder_Release((IShellFolder*)This);2447 return IUnknown_Release(This->pUnkOuter); 2279 2448 } 2280 2449
Note:
See TracChangeset
for help on using the changeset viewer.