Ignore:
Timestamp:
Mar 26, 2000, 6:34:57 PM (25 years ago)
Author:
cbratschi
Message:

merged with Corel WINE 20000324

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:27 cbratschi Exp $ */
     1/* $Id: shlfolder.cpp,v 1.9 2000-03-26 16:34:52 cbratschi Exp $ */
    22/*
    33 * Shell Folder stuff
     
    88 * IShellFolder2 and related interfaces
    99 *
     10 * Corel WINE 20000324 level
    1011 */
    1112
     
    3637DEFAULT_DEBUG_CHANNEL(shell)
    3738
    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
    3950
    4051typedef struct
     
    96107   HRESULT     hr = E_OUTOFMEMORY;
    97108   LPITEMIDLIST   pidlOut, pidlTemp = NULL;
    98    IShellFolder  *psfChild;
     109   IShellFolder  *psfChild = NULL;
    99110
    100111   TRACE("(%p %p %s)\n",psf, pidlInOut? *pidlInOut: NULL, debugstr_w(szNext));
     
    103114   /* get the shellfolder for the child pidl and let it analyse further */
    104115   hr = IShellFolder_BindToObject(psf, *pidlInOut, NULL, &IID_IShellFolder, (LPVOID*)&psfChild);
    105 
     116dprintf(("C 1"));
    106117   if (psfChild)
    107    {
     118   {  dprintf(("C 1a %d",psfChild/*,(psfChild)->fnParseDisplayName()*/));
    108119     hr = IShellFolder_ParseDisplayName(psfChild, hwndOwner, NULL, szNext, pEaten, &pidlOut, pdwAttributes);
     120dprintf(("C 1b"));
    109121     IShellFolder_Release(psfChild);
    110 
     122dprintf(("C 2"));
    111123     pidlTemp = ILCombine(*pidlInOut, pidlOut);
    112 
     124dprintf(("C 3"));
    113125     if (pidlOut)
    114126       ILFree(pidlOut);
    115127   }
    116 
     128dprintf(("C 4"));
    117129   ILFree(*pidlInOut);
    118130   *pidlInOut = pidlTemp;
     
    207219typedef struct
    208220{
    209    ICOM_VTABLE(IShellFolder2)*            lpvtbl;
     221   ICOM_VTABLE(IUnknown)* lpVtbl;
    210222   DWORD          ref;
    211223
     224   ICOM_VTABLE(IShellFolder2)*           lpvtblShellFolder;
    212225   ICOM_VTABLE(IPersistFolder)*          lpvtblPersistFolder;
    213226   ICOM_VTABLE(IDropTarget)*             lpvtblDropTarget;
     227
     228   IUnknown                     *pUnkOuter;     /* used for aggregation */
    214229
    215230   CLSID*                                pclsid;
     
    222237} IGenericSFImpl;
    223238
     239extern struct ICOM_VTABLE(IUnknown) unkvt;
    224240extern struct ICOM_VTABLE(IShellFolder2) sfvt;
    225241extern struct ICOM_VTABLE(IPersistFolder) psfvt;
    226 extern struct ICOM_VTABLE(IDropTarget) dt2vt;
     242extern struct ICOM_VTABLE(IDropTarget) dtvt;
    227243
    228244static 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);
    229248
    230249#define _IPersistFolder_Offset ((int)(&(((IGenericSFImpl*)0)->lpvtblPersistFolder)))
     
    233252#define _IDropTarget_Offset ((int)(&(((IGenericSFImpl*)0)->lpvtblDropTarget)))
    234253#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*/
     268static 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*/
     282static 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
     318static 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
     329static 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
     354struct ICOM_VTABLE(IUnknown) unkvt =
     355{
     356        ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
     357        IUnknown_fnQueryInterface,
     358        IUnknown_fnAddRef,
     359        IUnknown_fnRelease,
     360};
    235361
    236362static shvheader GenericSFHeader [] =
     
    245371
    246372/**************************************************************************
    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*/
     382HRESULT 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;
    259420}
    260421
     
    262423*    IShellFolder_Constructor
    263424*
     425* NOTES
     426*       THIS points to the parent folder
    264427*/
    265428
    266429static IShellFolder * IShellFolder_Constructor(
    267    IShellFolder * psf,
     430   IShellFolder2 * iface,
    268431   LPITEMIDLIST pidl)
    269432{
    270433   IGenericSFImpl *                      sf;
    271    IGenericSFImpl *                      sfParent = (IGenericSFImpl*) psf;
    272434   DWORD       dwSize=0;
     435
     436   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    273437
    274438   sf=(IGenericSFImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IGenericSFImpl));
    275439   sf->ref=1;
    276440
    277    sf->lpvtbl=&sfvt;
     441   ICOM_VTBL(sf)=&unkvt;
     442   sf->lpvtblShellFolder=&sfvt;
    278443   sf->lpvtblPersistFolder=&psfvt;
    279    sf->lpvtblDropTarget=&dt2vt;
     444   sf->lpvtblDropTarget=&dtvt;
    280445   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);
    285449   pdump(pidl);
    286450
    287    if(pidl)                                    /* do we have a pidl? */
     451   if(pidl && iface)                                    /* do we have a pidl? */
    288452   {
    289453     int len;
    290454
    291      sf->absPidl = ILCombine(sfParent->absPidl, pidl);  /* build a absolute pidl */
     455     sf->absPidl = ILCombine(This->absPidl, pidl);  /* build a absolute pidl */
    292456
    293457     if (!_ILIsSpecialFolder(pidl))               /* only file system paths */
    294458     {
    295        if(sfParent->sMyPath)                      /* get the size of the parents path */
     459       if(This->sMyPath)                      /* get the size of the parents path */
    296460       {
    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));
    299463       }
    300464
     
    305469       *(sf->sMyPath)=0x00;
    306470
    307        if(sfParent->sMyPath)                      /* if the parent has a path, get it*/
     471       if(This->sMyPath)                      /* if the parent has a path, get it*/
    308472       {
    309          strcpy(sf->sMyPath, sfParent->sMyPath);
     473         strcpy(sf->sMyPath, This->sMyPath);
    310474         PathAddBackslashA (sf->sMyPath);
    311475       }
     
    321485
    322486   shell32_ObjCount++;
    323    return (IShellFolder *)sf;
     487   return _IShellFolder_(sf);
    324488}
    325489/**************************************************************************
     
    335499   LPVOID *ppvObj)
    336500{
    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);
    378509}
    379510
     
    384515static ULONG WINAPI IShellFolder_fnAddRef(IShellFolder2 * iface)
    385516{
    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);
    395523}
    396524
     
    400528static ULONG WINAPI IShellFolder_fnRelease(IShellFolder2 * iface)
    401529{
    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);
    429536}
    430537/**************************************************************************
     
    459566   DWORD *pdwAttributes)
    460567{
    461    ICOM_THIS(IGenericSFImpl, iface);
     568   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    462569
    463570   HRESULT     hr = E_OUTOFMEMORY;
     
    494601       if (szNext && *szNext)
    495602       {
    496          hr = SHELL32_ParseNextElement(hwndOwner, (IShellFolder2*)This, &pidlTemp, (LPOLESTR)szNext, pchEaten, pdwAttributes);
     603         hr = SHELL32_ParseNextElement(hwndOwner, iface, &pidlTemp, (LPOLESTR)szNext, pchEaten, pdwAttributes);
    497604       }
    498605       else
     
    523630   LPENUMIDLIST* ppEnumIDList)
    524631{
    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;
    537653}
    538654
     
    548664         LPBC pbcReserved, REFIID riid, LPVOID * ppvOut)
    549665{
    550    ICOM_THIS(IGenericSFImpl, iface);
     666   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    551667   GUID     const * iid;
    552668   char     xriid[50];
     
    559675   TRACE("(%p)->(pidl=%p,%p,\n\tIID:\t%s,%p)\n",This,pidl,pbcReserved,xriid,ppvOut);
    560676
    561    if(!pidl || !ppvOut) return E_INVALIDARG;
     677   if(!ppvOut) return E_INVALIDARG;
    562678
    563679   *ppvOut = NULL;
     680
     681   if (!pidl) return E_INVALIDARG;
    564682
    565683   iid = _ILGetGUIDPointer(pidl);
     
    583701   {
    584702     LPITEMIDLIST pidltemp = ILCloneFirst(pidl);
    585      pShellFolder = IShellFolder_Constructor((IShellFolder*)This, pidltemp);
     703     pShellFolder = IShellFolder_Constructor(iface, pidltemp);
    586704     ILFree(pidltemp);
    587705   }
     
    618736   LPVOID *ppvOut)
    619737{
    620    ICOM_THIS(IGenericSFImpl, iface);
     738   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    621739
    622740   char xriid[50];
     
    651769   LPCITEMIDLIST pidl2)
    652770{
    653    ICOM_THIS(IGenericSFImpl, iface);
     771   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    654772
    655773   CHAR szTemp1[MAX_PATH];
     
    706824           pidl2 = ILGetNext(pidl2);
    707825
    708            hr = IShellFolder_BindToObject((IShellFolder*)This, pidlTemp, NULL, &IID_IShellFolder, (LPVOID*)&psf);
     826           hr = IShellFolder_BindToObject(iface, pidlTemp, NULL, &IID_IShellFolder, (LPVOID*)&psf);
    709827           if (SUCCEEDED(hr))
    710828           {
     
    737855       HWND hwndOwner, REFIID riid, LPVOID *ppvOut)
    738856{
    739    ICOM_THIS(IGenericSFImpl, iface);
     857   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    740858
    741859   LPSHELLVIEW pShellView;
     
    752870     if(IsEqualIID(riid, &IID_IDropTarget))
    753871     {
    754        hr = IShellFolder_QueryInterface((IShellFolder*)This, &IID_IDropTarget, ppvOut);
     872       hr = IShellFolder_QueryInterface(iface, &IID_IDropTarget, ppvOut);
    755873     }
    756874     else if(IsEqualIID(riid, &IID_IContextMenu))
     
    761879     else if(IsEqualIID(riid, &IID_IShellView))
    762880     {
    763        pShellView = IShellView_Constructor((IShellFolder *) This);
     881       pShellView = IShellView_Constructor((IShellFolder*)iface);
    764882       if(pShellView)
    765883       {
     
    784902static HRESULT WINAPI IShellFolder_fnGetAttributesOf(IShellFolder2 * iface,UINT cidl,LPCITEMIDLIST *apidl,DWORD *rgfInOut)
    785903{
    786    ICOM_THIS(IGenericSFImpl, iface);
     904   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    787905
    788906   HRESULT hr = S_OK;
    789907
    790908   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
    791916
    792917   if ( (!cidl) || (!apidl) || (!rgfInOut))
     
    846971   LPVOID * ppvOut)
    847972{
    848    ICOM_THIS(IGenericSFImpl, iface);
     973   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    849974
    850975   char     xclsid[50];
     
    864989     if(IsEqualIID(riid, &IID_IContextMenu) && (cidl >= 1))
    865990     {
    866        pObj  = (LPUNKNOWN)IContextMenu_Constructor((IShellFolder *)This, This->absPidl, apidl, cidl);
     991       pObj  = (LPUNKNOWN)IContextMenu_Constructor((IShellFolder *)iface, This->absPidl, apidl, cidl);
    867992       hr = S_OK;
    868993     }
     
    8811006     else if (IsEqualIID(riid, &IID_IDropTarget) && (cidl >= 1))
    8821007     {
    883        hr = IShellFolder_QueryInterface((IShellFolder*)This, &IID_IDropTarget, (LPVOID*)&pObj);
     1008       hr = IShellFolder_QueryInterface(iface, &IID_IDropTarget, (LPVOID*)&pObj);
    8841009     }
    8851010     else
     
    9181043   LPSTRRET strRet)
    9191044{
    920    ICOM_THIS(IGenericSFImpl, iface);
     1045   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    9211046
    9221047   CHAR     szPath[MAX_PATH]= "";
     
    9551080     len = strlen(szPath);
    9561081
    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)))
    9581083       return E_OUTOFMEMORY;
    9591084   }
     
    9851110   LPITEMIDLIST *pPidlOut)
    9861111{
    987    ICOM_THIS(IGenericSFImpl, iface);
     1112   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    9881113
    9891114   FIXME("(%p)->(%u,pidl=%p,%s,%lu,%p),stub!\n",
     
    9981123static HRESULT WINAPI IShellFolder_fnGetFolderPath(IShellFolder2 * iface, LPSTR lpszOut, DWORD dwOutSize)
    9991124{
    1000    ICOM_THIS(IGenericSFImpl, iface);
     1125   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    10011126
    10021127   TRACE("(%p)->(%p %lu)\n",This, lpszOut, dwOutSize);
     
    10181143   GUID *pguid)
    10191144{
    1020    ICOM_THIS(IGenericSFImpl, iface);
    1021    TRACE("(%p)\n",This);
     1145   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     1146   FIXME("(%p)\n",This);
    10221147   return E_NOTIMPL;
    10231148}
     
    10261151   IEnumExtraSearch **ppenum)
    10271152{
    1028    ICOM_THIS(IGenericSFImpl, iface);
    1029    TRACE("(%p)\n",This);
     1153   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     1154   FIXME("(%p)\n",This);
    10301155   return E_NOTIMPL;
    10311156}
     
    10361161   ULONG *pDisplay)
    10371162{
    1038    ICOM_THIS(IGenericSFImpl, iface);
     1163   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    10391164
    10401165   TRACE("(%p)\n",This);
     
    10501175   DWORD *pcsFlags)
    10511176{
    1052    ICOM_THIS(IGenericSFImpl, iface);
     1177   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    10531178
    10541179   TRACE("(%p)\n",This);
     
    10661191   VARIANT *pv)
    10671192{
    1068    ICOM_THIS(IGenericSFImpl, iface);
    1069    TRACE("(%p)\n",This);
     1193   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     1194   FIXME("(%p)\n",This);
    10701195   return E_NOTIMPL;
    10711196}
     
    10761201   SHELLDETAILS *psd)
    10771202{
    1078    ICOM_THIS(IGenericSFImpl, iface);
     1203   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    10791204   HRESULT hr = E_FAIL;
    10801205
     
    11101235         break;
    11111236       case 4: /* attributes */
    1112          _ILGetAttributeStr(pidl, psd->str.u.cStr, MAX_PATH);
     1237         _ILGetFileAttributes(pidl, psd->str.u.cStr, MAX_PATH);
    11131238         break;
    11141239     }
     
    11241249   SHCOLUMNID *pscid)
    11251250{
    1126    ICOM_THIS(IGenericSFImpl, iface);
    1127    TRACE("(%p)\n",This);
     1251   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     1252   FIXME("(%p)\n",This);
    11281253   return E_NOTIMPL;
    11291254}
     
    11831308   sf=(IGenericSFImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IGenericSFImpl));
    11841309   sf->ref=1;
    1185    sf->lpvtbl=&sfdvt;
     1310   ICOM_VTBL(sf)=&unkvt;
     1311   sf->lpvtblShellFolder=&sfdvt;
    11861312   sf->absPidl=_ILCreateDesktop();       /* my qualified pidl */
     1313   sf->pUnkOuter = (IUnknown *) &sf->lpVtbl;
    11871314
    11881315   TRACE("(%p)\n",sf);
    11891316
    11901317   shell32_ObjCount++;
    1191    return (IShellFolder *)sf;
     1318   return _IShellFolder_(sf);
    11921319}
    11931320
     
    12021329   LPVOID *ppvObj)
    12031330{
    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;
    12301360}
    12311361
     
    12461376   DWORD *pdwAttributes)
    12471377{
    1248    ICOM_THIS(IGenericSFImpl, iface);
     1378   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    12491379
    12501380   LPCWSTR     szNext=NULL;
     
    12651395   if (szNext && *szNext)
    12661396   {
    1267      hr = SHELL32_ParseNextElement(hwndOwner, (IShellFolder2*)This, &pidlTemp, (LPOLESTR)szNext, pchEaten, pdwAttributes);
     1397     hr = SHELL32_ParseNextElement(hwndOwner,iface, &pidlTemp, (LPOLESTR)szNext, pchEaten, pdwAttributes);
    12681398   }
    12691399   else
     
    12881418   LPENUMIDLIST* ppEnumIDList)
    12891419{
    1290    ICOM_THIS(IGenericSFImpl, iface);
     1420   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    12911421
    12921422   TRACE("(%p)->(HWND=0x%08x flags=0x%08lx pplist=%p)\n",This,hwndOwner,dwFlags,ppEnumIDList);
     
    13081438         LPBC pbcReserved, REFIID riid, LPVOID * ppvOut)
    13091439{
    1310    ICOM_THIS(IGenericSFImpl, iface);
     1440   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    13111441   GUID     const * clsid;
    13121442   char     xriid[50];
     
    13221452   if (clsid)
    13231453   {
    1324      if ( IsEqualIID(clsid, &IID_MyComputer))
     1454     if ( IsEqualIID(clsid, &CLSID_MyComputer))
    13251455     {
    13261456       pShellFolder = ISF_MyComputer_Constructor();
     
    13381468   {
    13391469     /* 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);
    13431487   }
    13441488
     
    13651509       HWND hwndOwner, REFIID riid, LPVOID *ppvOut)
    13661510{
    1367    ICOM_THIS(IGenericSFImpl, iface);
     1511   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    13681512
    13691513   LPSHELLVIEW pShellView;
     
    13901534     else if(IsEqualIID(riid, &IID_IShellView))
    13911535     {
    1392        pShellView = IShellView_Constructor((IShellFolder *) This);
     1536       pShellView = IShellView_Constructor((IShellFolder*)iface);
    13931537       if(pShellView)
    13941538       {
     
    14071551static HRESULT WINAPI ISF_Desktop_fnGetAttributesOf(IShellFolder2 * iface,UINT cidl,LPCITEMIDLIST *apidl,DWORD *rgfInOut)
    14081552{
    1409    ICOM_THIS(IGenericSFImpl, iface);
     1553   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    14101554
    14111555   GUID     const * clsid;
     
    14251569     if (clsid)
    14261570     {
    1427        if (IsEqualIID(clsid, &IID_MyComputer))
     1571       if (IsEqualIID(clsid, &CLSID_MyComputer))
    14281572       {
    14291573         *rgfInOut &= 0xb0000154;
     
    14731617   LPSTRRET strRet)
    14741618{
    1475    ICOM_THIS(IGenericSFImpl, iface);
     1619   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    14761620
    14771621   CHAR     szPath[MAX_PATH]= "";
     
    14921636   else
    14931637   {
    1494      if (!SUCCEEDED(SHELL32_GetDisplayNameOfChild((IShellFolder2*)This, pidl, dwFlags, szPath, MAX_PATH)))
     1638     if (!SUCCEEDED(SHELL32_GetDisplayNameOfChild(iface, pidl, dwFlags, szPath, MAX_PATH)))
    14951639       return E_OUTOFMEMORY;
    14961640   }
     
    15071651   GUID *pguid)
    15081652{
    1509    ICOM_THIS(IGenericSFImpl, iface);
     1653   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    15101654   FIXME("(%p)\n",This);
    15111655   return E_NOTIMPL;
     
    15151659   IEnumExtraSearch **ppenum)
    15161660{
    1517    ICOM_THIS(IGenericSFImpl, iface);
     1661   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    15181662   FIXME("(%p)\n",This);
    15191663   return E_NOTIMPL;
     
    15251669   ULONG *pDisplay)
    15261670{
    1527    ICOM_THIS(IGenericSFImpl, iface);
     1671   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    15281672
    15291673   TRACE("(%p)\n",This);
     
    15391683   DWORD *pcsFlags)
    15401684{
    1541    ICOM_THIS(IGenericSFImpl, iface);
     1685   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    15421686
    15431687   TRACE("(%p)\n",This);
     
    15551699   VARIANT *pv)
    15561700{
    1557    ICOM_THIS(IGenericSFImpl, iface);
     1701   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    15581702   FIXME("(%p)\n",This);
    15591703
     
    15661710   SHELLDETAILS *psd)
    15671711{
    1568    ICOM_THIS(IGenericSFImpl, iface);
     1712   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    15691713   HRESULT hr = E_FAIL;;
    15701714
     
    15991743         break;
    16001744       case 4: /* attributes */
    1601          _ILGetAttributeStr(pidl, psd->str.u.cStr, MAX_PATH);
     1745         _ILGetFileAttributes(pidl, psd->str.u.cStr, MAX_PATH);
    16021746         break;
    16031747     }
     
    16131757   SHCOLUMNID *pscid)
    16141758{
    1615    ICOM_THIS(IGenericSFImpl, iface);
     1759   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    16161760   FIXME("(%p)\n",This);
    16171761   return E_NOTIMPL;
     
    16711815   sf->ref=1;
    16721816
    1673    sf->lpvtbl = &sfmcvt;
     1817   ICOM_VTBL(sf)=&unkvt;
     1818   sf->lpvtblShellFolder=&sfmcvt;
    16741819   sf->lpvtblPersistFolder = &psfvt;
    16751820   sf->pclsid = (CLSID*)&CLSID_SFMyComp;
    16761821   sf->absPidl=_ILCreateMyComputer();    /* my qualified pidl */
     1822   sf->pUnkOuter = (IUnknown *) &sf->lpVtbl;
    16771823
    16781824   TRACE("(%p)\n",sf);
    16791825
    16801826   shell32_ObjCount++;
    1681    return (IShellFolder *)sf;
     1827   return _IShellFolder_(sf);
    16821828}
    16831829
     
    16941840   DWORD *pdwAttributes)
    16951841{
    1696    ICOM_THIS(IGenericSFImpl, iface);
     1842   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    16971843
    16981844   HRESULT     hr = E_OUTOFMEMORY;
     
    17171863     if (szNext && *szNext)
    17181864     {
    1719        hr = SHELL32_ParseNextElement(hwndOwner, (IShellFolder2*)This, &pidlTemp, (LPOLESTR)szNext, pchEaten, pdwAttributes);
     1865       hr = SHELL32_ParseNextElement(hwndOwner,iface, &pidlTemp, (LPOLESTR)szNext, pchEaten, pdwAttributes);
    17201866     }
    17211867     else
     
    17401886   LPENUMIDLIST* ppEnumIDList)
    17411887{
    1742    ICOM_THIS(IGenericSFImpl, iface);
     1888   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    17431889
    17441890   TRACE("(%p)->(HWND=0x%08x flags=0x%08lx pplist=%p)\n",This,hwndOwner,dwFlags,ppEnumIDList);
     
    17601906         LPBC pbcReserved, REFIID riid, LPVOID * ppvOut)
    17611907{
    1762    ICOM_THIS(IGenericSFImpl, iface);
     1908   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    17631909   GUID     const * clsid;
    17641910   char     xriid[50];
     
    17701916   TRACE("(%p)->(pidl=%p,%p,\n\tIID:\t%s,%p)\n",This,pidl,pbcReserved,xriid,ppvOut);
    17711917
    1772    if(!pidl || !ppvOut) return E_INVALIDARG;
     1918   if(!ppvOut) return E_INVALIDARG;
    17731919
    17741920   *ppvOut = NULL;
    17751921
    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))
    17771925   {
    17781926      if (!SUCCEEDED(SHELL32_CoCreateInitSF (This->absPidl, pidl, clsid, riid, (LPVOID*)&pShellFolder)))
     
    17861934
    17871935     pidltemp = ILCloneFirst(pidl);
    1788      pShellFolder = IShellFolder_Constructor((IShellFolder*)This, pidltemp);
     1936     pShellFolder = IShellFolder_Constructor(iface, pidltemp);
    17891937     ILFree(pidltemp);
    17901938   }
     
    18121960       HWND hwndOwner, REFIID riid, LPVOID *ppvOut)
    18131961{
    1814    ICOM_THIS(IGenericSFImpl, iface);
     1962   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    18151963
    18161964   LPSHELLVIEW pShellView;
     
    18371985     else if(IsEqualIID(riid, &IID_IShellView))
    18381986     {
    1839        pShellView = IShellView_Constructor((IShellFolder *) This);
     1987       pShellView = IShellView_Constructor((IShellFolder*)iface);
    18401988       if(pShellView)
    18411989       {
     
    18542002static HRESULT WINAPI ISF_MyComputer_fnGetAttributesOf(IShellFolder2 * iface,UINT cidl,LPCITEMIDLIST *apidl,DWORD *rgfInOut)
    18552003{
    1856    ICOM_THIS(IGenericSFImpl, iface);
     2004   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    18572005
    18582006   GUID     const * clsid;
     
    19102058   LPSTRRET strRet)
    19112059{
    1912    ICOM_THIS(IGenericSFImpl, iface);
     2060   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    19132061
    19142062   char     szPath[MAX_PATH], szDrive[18];
     
    19622110     len = strlen(szPath);
    19632111
    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)))
    19652113       return E_OUTOFMEMORY;
    19662114   }
     
    19772125   GUID *pguid)
    19782126{
    1979    ICOM_THIS(IGenericSFImpl, iface);
     2127   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    19802128   FIXME("(%p)\n",This);
    19812129   return E_NOTIMPL;
     
    19852133   IEnumExtraSearch **ppenum)
    19862134{
    1987    ICOM_THIS(IGenericSFImpl, iface);
     2135   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    19882136   FIXME("(%p)\n",This);
    19892137   return E_NOTIMPL;
     
    19952143   ULONG *pDisplay)
    19962144{
    1997    ICOM_THIS(IGenericSFImpl, iface);
     2145   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    19982146
    19992147   TRACE("(%p)\n",This);
     
    20092157   DWORD *pcsFlags)
    20102158{
    2011    ICOM_THIS(IGenericSFImpl, iface);
     2159   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    20122160
    20132161   TRACE("(%p)\n",This);
     
    20252173   VARIANT *pv)
    20262174{
    2027    ICOM_THIS(IGenericSFImpl, iface);
     2175   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    20282176   FIXME("(%p)\n",This);
    20292177
     
    20382186   SHELLDETAILS *psd)
    20392187{
    2040    ICOM_THIS(IGenericSFImpl, iface);
     2188   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    20412189   HRESULT hr;
    20422190
     
    20732221           _ILSimpleGetText(pidl, szPath, MAX_PATH);
    20742222           GetDiskFreeSpaceExA(szPath, NULL, &ulBytes, NULL);
     2223           //CB: WINE uses ulBytes.s.LowPart
    20752224           StrFormatByteSizeA(ulBytes.LowPart, psd->str.u.cStr, MAX_PATH);
    20762225         }
     
    20812230           _ILSimpleGetText(pidl, szPath, MAX_PATH);
    20822231           GetDiskFreeSpaceExA(szPath, &ulBytes, NULL, NULL);
     2232           //CB: WINE uses ulBytes.s.LowPart
    20832233           StrFormatByteSizeA(ulBytes.LowPart, psd->str.u.cStr, MAX_PATH);
    20842234         }
     
    20952245   SHCOLUMNID *pscid)
    20962246{
    2097    ICOM_THIS(IGenericSFImpl, iface);
     2247   _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    20982248   FIXME("(%p)\n",This);
    20992249   return E_NOTIMPL;
     
    21412291   TRACE("(%p)\n", This);
    21422292
    2143    return IShellFolder_QueryInterface((IShellFolder*)This, iid, ppvObj);
     2293   return IUnknown_QueryInterface(This->pUnkOuter, iid, ppvObj);
    21442294}
    21452295
     
    21512301   IPersistFolder *                      iface)
    21522302{
    2153    _ICOM_THIS_From_IPersistFolder(IShellFolder, iface);
    2154 
    2155    TRACE("(%p)\n", This);
    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);
    21582308}
    21592309
     
    21692319   TRACE("(%p)\n", This);
    21702320
    2171    return IShellFolder_Release((IShellFolder*)This);
     2321   return IUnknown_Release(This->pUnkOuter);
    21722322}
    21732323
     
    21992349   LPCITEMIDLIST                         pidl)
    22002350{
     2351   char sTemp[MAX_PATH];
    22012352   _ICOM_THIS_From_IPersistFolder(IGenericSFImpl, iface);
    22022353
    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;
    22122381}
    22132382
     
    22582427   TRACE("(%p)\n", This);
    22592428
    2260    return IShellFolder_QueryInterface((IShellFolder*)This, riid, ppvObj);
     2429   return IUnknown_QueryInterface(This->pUnkOuter, riid, ppvObj);
    22612430}
    22622431
     
    22672436   TRACE("(%p)\n", This);
    22682437
    2269    return IShellFolder_AddRef((IShellFolder*)This);
     2438   return IUnknown_AddRef(This->pUnkOuter);
    22702439}
    22712440
     
    22762445   TRACE("(%p)\n", This);
    22772446
    2278    return IShellFolder_Release((IShellFolder*)This);
     2447   return IUnknown_Release(This->pUnkOuter);
    22792448}
    22802449
Note: See TracChangeset for help on using the changeset viewer.