4 * Copyright 1998 Juergen Schmied
7 * a pidl == NULL means desktop and is legal
18 #include "interfaces.h"
25 #include "shell32_main.h"
29 void pdump (LPCITEMIDLIST pidl)
32 LPITEMIDLIST pidltemp = pidl;
34 { TRACE(pidl,"-------- pidl = NULL (Root)\n");
37 TRACE(pidl,"-------- pidl=%p \n", pidl);
38 if (pidltemp->mkid.cb)
40 { type = _ILGetDataPointer(pidltemp)->type;
41 szData = _ILGetTextPointer(type, _ILGetDataPointer(pidltemp));
43 TRACE(pidl,"---- pidl=%p size=%u type=%lx %s\n",pidltemp, pidltemp->mkid.cb,type,debugstr_a(szData));
45 pidltemp = ILGetNext(pidltemp);
46 } while (pidltemp->mkid.cb);
50 TRACE(pidl,"empty pidl (Desktop)\n");
52 /*************************************************************************
53 * ILGetDisplayName [SHELL32.15]
55 BOOL32 WINAPI ILGetDisplayName(LPCITEMIDLIST iil,LPSTR path)
56 { FIXME(pidl,"(%p,%p),stub, return e:!\n",iil,path);
60 /*************************************************************************
61 * ILFindLastID [SHELL32.16]
63 LPITEMIDLIST WINAPI ILFindLastID(LPITEMIDLIST pidl)
64 { LPITEMIDLIST pidlLast = NULL;
66 TRACE(pidl,"(pidl=%p)\n",pidl);
69 { while(pidl->mkid.cb)
70 { pidlLast = (LPITEMIDLIST)pidl;
71 pidl = ILGetNext(pidl);
76 /*************************************************************************
77 * ILRemoveLastID [SHELL32.17]
79 * Removes the last item
81 BOOL32 WINAPI ILRemoveLastID(LPCITEMIDLIST pidl)
82 { TRACE(shell,"pidl=%p\n",pidl);
83 if (!pidl || !pidl->mkid.cb)
85 ILFindLastID(pidl)->mkid.cb = 0;
89 /*************************************************************************
90 * ILClone [SHELL32.18]
95 LPITEMIDLIST WINAPI ILClone (LPCITEMIDLIST pidl)
102 len = ILGetSize(pidl);
103 newpidl = (LPITEMIDLIST)SHAlloc(len);
105 memcpy(newpidl,pidl,len);
107 TRACE(pidl,"pidl=%p newpidl=%p\n",pidl, newpidl);
112 /*************************************************************************
113 * ILCloneFirst [SHELL32.19]
116 * duplicates the first idlist of a complex pidl
118 LPITEMIDLIST WINAPI ILCloneFirst(LPCITEMIDLIST pidl)
120 LPITEMIDLIST newpidl=NULL;
122 TRACE(pidl,"pidl=%p \n",pidl);
126 { len = pidl->mkid.cb;
127 newpidl = (LPITEMIDLIST) SHAlloc (len+2);
129 { memcpy(newpidl,pidl,len);
130 ILGetNext(newpidl)->mkid.cb = 0x00;
133 TRACE(pidl,"-- newpidl=%p\n",newpidl);
137 /*************************************************************************
138 * ILIsEqual [SHELL32.21]
141 BOOL32 WINAPI ILIsEqual(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
142 { FIXME(pidl,"pidl1=%p pidl2=%p stub\n",pidl1, pidl2);
147 /*************************************************************************
148 * ILFindChild [SHELL32.24]
151 DWORD WINAPI ILFindChild(LPCITEMIDLIST pidl1,LPCITEMIDLIST pidl2)
152 { FIXME(pidl,"%p %p stub\n",pidl1,pidl2);
158 /*************************************************************************
159 * ILCombine [SHELL32.25]
162 * Concatenates two complex idlists.
163 * The pidl is the first one, pidlsub the next one
164 * Does not destroy the passed in idlists!
166 LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1,LPCITEMIDLIST pidl2)
168 LPITEMIDLIST pidlNew;
170 TRACE(pidl,"pidl=%p pidl=%p\n",pidl1,pidl2);
180 { pidlNew = ILClone(pidl2);
185 { pidlNew = ILClone(pidl1);
189 len1 = ILGetSize(pidl1)-2;
190 len2 = ILGetSize(pidl2);
191 pidlNew = SHAlloc(len1+len2);
194 { memcpy(pidlNew,pidl1,len1);
195 memcpy(((BYTE *)pidlNew)+len1,pidl2,len2);
198 /* TRACE(pidl,"--new pidl=%p\n",pidlNew);*/
201 /*************************************************************************
202 * SHGetRealIDL [SHELL32.98]
206 LPITEMIDLIST WINAPI SHGetRealIDL(DWORD x, DWORD y, DWORD z)
207 { FIXME(pidl,"0x%04lx 0x%04lx 0x%04lx\n",x,y,z);
211 /*************************************************************************
212 * SHLogILFromFSIL [SHELL32.95]
215 * might be the prepending of MyComputer to a filesystem pidl (?)
217 LPITEMIDLIST WINAPI SHLogILFromFSIL(LPITEMIDLIST pidl)
218 { FIXME(pidl,"(pidl=%p)\n",pidl);
220 return ILClone(pidl);
223 /*************************************************************************
224 * ILGetSize [SHELL32.152]
225 * gets the byte size of an idlist including zero terminator (pidl)
234 * exported by ordinal
236 DWORD WINAPI ILGetSize(LPITEMIDLIST pidl)
237 { LPSHITEMID si = &(pidl->mkid);
243 si = (LPSHITEMID)(((LPBYTE)si)+si->cb);
247 TRACE(pidl,"pidl=%p size=%lu\n",pidl, len);
250 /*************************************************************************
251 * ILGetNext [SHELL32.153]
252 * gets the next simple pidl of a complex pidl
258 * pointer to next element
261 LPITEMIDLIST WINAPI ILGetNext(LPITEMIDLIST pidl)
262 { LPITEMIDLIST nextpidl;
264 TRACE(pidl,"(pidl=%p)\n",pidl);
266 { nextpidl = (LPITEMIDLIST)(LPBYTE)(((LPBYTE)pidl) + pidl->mkid.cb);
273 /*************************************************************************
274 * ILAppend [SHELL32.154]
277 * Adds the single item to the idlist indicated by pidl.
278 * if bEnd is 0, adds the item to the front of the list,
279 * otherwise adds the item to the end. (???)
280 * Destroys the passed in idlist! (???)
282 LPITEMIDLIST WINAPI ILAppend(LPITEMIDLIST pidl,LPCITEMIDLIST item,BOOL32 bEnd)
283 { LPITEMIDLIST idlRet;
284 WARN(pidl,"(pidl=%p,pidl=%p,%08u)semi-stub\n",pidl,item,bEnd);
288 if (_ILIsDesktop(pidl))
289 { idlRet = ILClone(item);
294 idlRet=ILCombine(pidl,item);
298 /*************************************************************************
299 * ILFree [SHELL32.155]
302 * free_check_ptr - frees memory (if not NULL)
303 * allocated by SHMalloc allocator
304 * exported by ordinal
306 DWORD WINAPI ILFree(LPVOID pidl)
307 { TRACE(pidl,"(pidl=0x%08lx)\n",(DWORD)pidl);
312 /*************************************************************************
313 * ILCreateFromPath [SHELL32.157]
316 LPITEMIDLIST WINAPI ILCreateFromPath(LPSTR path)
317 { LPSHELLFOLDER shellfolder;
318 LPITEMIDLIST pidlnew;
319 CHAR pszTemp[MAX_PATH*2];
320 LPWSTR lpszDisplayName = (LPWSTR)&pszTemp[0];
323 TRACE(pidl,"(path=%s)\n",path);
325 LocalToWideChar32(lpszDisplayName, path, MAX_PATH);
327 if (SHGetDesktopFolder(&shellfolder)==S_OK)
328 { shellfolder->lpvtbl->fnParseDisplayName(shellfolder,0, NULL,lpszDisplayName,&pchEaten,&pidlnew,NULL);
329 shellfolder->lpvtbl->fnRelease(shellfolder);
334 /**************************************************************************
338 /**************************************************************************
340 * _ILCreateMyComputer()
345 LPITEMIDLIST WINAPI _ILCreateDesktop()
346 { TRACE(pidl,"()\n");
347 return _ILCreate(PT_DESKTOP, NULL, 0);
349 LPITEMIDLIST WINAPI _ILCreateMyComputer()
350 { TRACE(pidl,"()\n");
351 return _ILCreate(PT_MYCOMP, (void *)"My Computer", strlen ("My Computer")+1);
353 LPITEMIDLIST WINAPI _ILCreateDrive( LPCSTR lpszNew)
355 strncpy (sTemp,lpszNew,4);
358 TRACE(pidl,"(%s)\n",sTemp);
359 return _ILCreate(PT_DRIVE,(LPVOID)&sTemp[0],4);
361 LPITEMIDLIST WINAPI _ILCreateFolder( LPCSTR lpszNew)
362 { TRACE(pidl,"(%s)\n",lpszNew);
363 return _ILCreate(PT_FOLDER, (LPVOID)lpszNew, strlen(lpszNew)+1);
365 LPITEMIDLIST WINAPI _ILCreateValue(LPCSTR lpszNew)
366 { TRACE(pidl,"(%s)\n",lpszNew);
367 return _ILCreate(PT_VALUE, (LPVOID)lpszNew, strlen(lpszNew)+1);
370 /**************************************************************************
375 BOOL32 WINAPI _ILGetDrive(LPCITEMIDLIST pidl,LPSTR pOut, UINT16 uSize)
376 { LPITEMIDLIST pidlTemp=NULL;
378 TRACE(pidl,"(%p,%p,%u)\n",pidl,pOut,uSize);
379 if(_ILIsMyComputer(pidl))
380 { pidlTemp = ILGetNext(pidl);
382 else if (pidlTemp && _ILIsDrive(pidlTemp))
383 { return (BOOL32)_ILGetData(PT_DRIVE, pidlTemp, (LPVOID)pOut, uSize);
387 /**************************************************************************
389 * Gets the text for only this item
391 DWORD WINAPI _ILGetItemText(LPCITEMIDLIST pidl, LPSTR lpszText, UINT16 uSize)
392 { TRACE(pidl,"(pidl=%p %p %x)\n",pidl,lpszText,uSize);
393 if (_ILIsMyComputer(pidl))
394 { return _ILGetData(PT_MYCOMP, pidl, (LPVOID)lpszText, uSize);
396 if (_ILIsDrive(pidl))
397 { return _ILGetData(PT_DRIVE, pidl, (LPVOID)lpszText, uSize);
399 if (_ILIsFolder (pidl))
400 { return _ILGetData(PT_FOLDER, pidl, (LPVOID)lpszText, uSize);
402 return _ILGetData(PT_VALUE, pidl, (LPVOID)lpszText, uSize);
404 /**************************************************************************
410 BOOL32 WINAPI _ILIsDesktop(LPCITEMIDLIST pidl)
411 { TRACE(pidl,"(%p)\n",pidl);
416 return ( pidl->mkid.cb == 0x00 );
419 BOOL32 WINAPI _ILIsMyComputer(LPCITEMIDLIST pidl)
421 TRACE(pidl,"(%p)\n",pidl);
426 pData = _ILGetDataPointer(pidl);
427 return (PT_MYCOMP == pData->type);
430 BOOL32 WINAPI _ILIsDrive(LPCITEMIDLIST pidl)
432 TRACE(pidl,"(%p)\n",pidl);
437 pData = _ILGetDataPointer(pidl);
438 return (PT_DRIVE == pData->type);
441 BOOL32 WINAPI _ILIsFolder(LPCITEMIDLIST pidl)
443 TRACE(pidl,"(%p)\n",pidl);
448 pData = _ILGetDataPointer(pidl);
449 return (PT_FOLDER == pData->type);
452 BOOL32 WINAPI _ILIsValue(LPCITEMIDLIST pidl)
454 TRACE(pidl,"(%p)\n",pidl);
459 pData = _ILGetDataPointer(pidl);
460 return (PT_VALUE == pData->type);
462 /**************************************************************************
466 BOOL32 WINAPI _ILHasFolders( LPSTR pszPath, LPCITEMIDLIST pidl)
467 { BOOL32 bResult= FALSE;
468 WIN32_FIND_DATA32A stffile;
471 TRACE(pidl,"%p %p\n", pszPath, pidl);
473 hFile = FindFirstFile32A(pszPath,&stffile);
475 { if (! (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
478 } while( FindNextFile32A(hFile,&stffile));
484 /**************************************************************************
486 * Creates a Path string from a PIDL, filtering out the special Folders
488 DWORD WINAPI _ILGetFolderText(LPCITEMIDLIST pidl,LPSTR lpszPath, DWORD dwSize)
489 { LPITEMIDLIST pidlTemp;
493 TRACE(pidl,"(%p path=%p)\n",pidl, lpszPath);
499 if(_ILIsMyComputer(pidl))
500 { pidlTemp = ILGetNext(pidl);
501 TRACE(pidl,"-- skip My Computer\n");
504 { pidlTemp = (LPITEMIDLIST)pidl;
507 //if this is NULL, return the required size of the buffer
509 { while(pidlTemp->mkid.cb)
510 { LPPIDLDATA pData = _ILGetDataPointer(pidlTemp);
511 pText = _ILGetTextPointer(pData->type,pData);
513 /*add the length of this item plus one for the backslash
514 fixme: is one to much, drive has its own backslash*/
515 dwCopied += strlen(pText) + 1;
516 pidlTemp = ILGetNext(pidlTemp);
519 //add one for the NULL terminator
520 TRACE(pidl,"-- (size=%lu)\n",dwCopied);
526 while(pidlTemp->mkid.cb && (dwCopied < dwSize))
527 { LPPIDLDATA pData = _ILGetDataPointer(pidlTemp);
529 //if this item is a value, then skip it and finish
530 if(PT_VALUE == pData->type)
533 pText = _ILGetTextPointer(pData->type,pData);
534 strcat(lpszPath, pText);
535 PathAddBackslash(lpszPath);
536 dwCopied += strlen(pText) + 1;
537 pidlTemp = ILGetNext(pidlTemp);
539 TRACE(pidl,"-- (size=%lu,%s)\n",dwCopied,lpszPath);
542 //remove the last backslash if necessary
544 { if(*(lpszPath + strlen(lpszPath) - 1) == '\\')
545 { *(lpszPath + strlen(lpszPath) - 1) = 0;
549 TRACE(pidl,"-- (path=%s)\n",lpszPath);
554 /**************************************************************************
556 * Gets the text for the last item in the list
558 DWORD WINAPI _ILGetValueText(
559 LPCITEMIDLIST pidl, LPSTR lpszValue, DWORD dwSize)
560 { LPITEMIDLIST pidlTemp=pidl;
561 CHAR szText[MAX_PATH];
563 TRACE(pidl,"(pidl=%p %p 0x%08lx)\n",pidl,lpszValue,dwSize);
569 while(pidlTemp->mkid.cb && !_ILIsValue(pidlTemp))
570 { pidlTemp = ILGetNext(pidlTemp);
573 if(!pidlTemp->mkid.cb)
577 _ILGetItemText( pidlTemp, szText, sizeof(szText));
580 { return strlen(szText) + 1;
582 strcpy(lpszValue, szText);
583 TRACE(pidl,"-- (pidl=%p %p=%s 0x%08lx)\n",pidl,lpszValue,lpszValue,dwSize);
584 return strlen(lpszValue);
586 /**************************************************************************
589 * used from ShellView
591 DWORD WINAPI _ILGetDataText( LPCITEMIDLIST pidlPath, LPCITEMIDLIST pidlValue, LPSTR lpszOut, DWORD dwOutSize)
596 FIXME(pidl,"(pidl=%p pidl=%p) stub\n",pidlPath,pidlValue);
598 if(!lpszOut || !pidlPath || !pidlValue)
602 /* fixme: get the driveletter*/
604 //assemble the Folder string
605 dwNameSize = _ILGetFolderText(pidlPath, NULL, 0);
606 lpszFolder = (LPSTR)HeapAlloc(GetProcessHeap(),0,dwNameSize);
610 _ILGetFolderText(pidlPath, lpszFolder, dwNameSize);
612 //assemble the value name
613 dwNameSize = _ILGetValueText(pidlValue, NULL, 0);
614 lpszValueName = (LPSTR)HeapAlloc(GetProcessHeap(),0,dwNameSize);
616 { HeapFree(GetProcessHeap(),0,lpszFolder);
619 _ILGetValueText(pidlValue, lpszValueName, dwNameSize);
621 /* fixme: we've got the path now do something with it*/
623 HeapFree(GetProcessHeap(),0,lpszFolder);
624 HeapFree(GetProcessHeap(),0,lpszValueName);
626 TRACE(pidl,"-- (%p=%s 0x%08lx)\n",lpszOut,lpszOut,dwOutSize);
631 /**************************************************************************
633 * Create a string that includes the Drive name, the folder text and
636 DWORD WINAPI _ILGetPidlPath( LPCITEMIDLIST pidl, LPSTR lpszOut, DWORD dwOutSize)
640 TRACE(pidl,"(%p,%lu)\n",lpszOut,dwOutSize);
649 dwOutSize -= _ILGetFolderText(pidl, lpszTemp, dwOutSize);
651 //add a backslash if necessary
652 len = strlen(lpszTemp);
653 if (len && lpszTemp[len-1]!='\\')
654 { lpszTemp[len+0]='\\';
655 lpszTemp[len+1]='\0';
659 lpszTemp = lpszOut + strlen(lpszOut);
661 //add the value string
662 _ILGetValueText(pidl, lpszTemp, dwOutSize);
664 //remove the last backslash if necessary
665 if(*(lpszOut + strlen(lpszOut) - 1) == '\\')
666 { *(lpszOut + strlen(lpszOut) - 1) = 0;
669 TRACE(pidl,"-- (%p=%s,%lu)\n",lpszOut,lpszOut,dwOutSize);
671 return strlen(lpszOut);
675 /**************************************************************************
678 * type = PT_DESKTOP | PT_DRIVE | PT_FOLDER | PT_VALUE
680 * uInSize = size of data
683 LPITEMIDLIST WINAPI _ILCreate(PIDLTYPE type, LPVOID pIn, UINT16 uInSize)
684 { LPITEMIDLIST pidlOut=NULL;
686 LPITEMIDLIST pidlTemp=NULL;
690 TRACE(pidl,"(%x %p %x)\n",type,pIn,uInSize);
692 if ( type == PT_DESKTOP)
693 { pidlOut = SHAlloc(2);
694 pidlOut->mkid.cb=0x0000;
702 /* the sizes of: cb(2), pidldata-1, szText+1, next cb(2) */
708 uSize = 4 + (sizeof(PIDLDATA)) + uInSize;
710 pidlOut = SHAlloc(uSize);
713 { pidlTemp->mkid.cb = uSize - 2;
714 pData =_ILGetDataPointer(pidlTemp);
715 pszDest = _ILGetTextPointer(type, pData);
719 memcpy(pszDest, pIn, uInSize);
720 TRACE(pidl,"- create My Computer: %s\n",debugstr_a(pszDest));
723 memcpy(pszDest, pIn, uInSize);
724 TRACE(pidl,"- create Drive: %s\n",debugstr_a(pszDest));
728 memcpy(pszDest, pIn, uInSize);
729 TRACE(pidl,"- create Value: %s\n",debugstr_a(pszDest));
732 FIXME(pidl,"-- wrong argument\n");
736 pidlTemp = ILGetNext(pidlTemp);
737 pidlTemp->mkid.cb = 0x00;
739 TRACE(pidl,"-- (pidl=%p, size=%u)\n",pidlOut,uSize-2);
742 /**************************************************************************
743 * _ILGetData(PIDLTYPE, LPCITEMIDLIST, LPVOID, UINT16)
745 DWORD WINAPI _ILGetData(PIDLTYPE type, LPCITEMIDLIST pidl, LPVOID pOut, UINT16 uOutSize)
750 TRACE(pidl,"(%x %p %p %x)\n",type,pidl,pOut,uOutSize);
758 pData = _ILGetDataPointer(pidl);
759 if ( pData->type != type)
760 { ERR(pidl,"-- wrong type\n");
763 pszSrc = _ILGetTextPointer(pData->type, pData);
769 strncpy((LPSTR)pOut, "My Computer", uOutSize);
770 dwReturn = strlen((LPSTR)pOut);
776 strncpy((LPSTR)pOut, pszSrc, uOutSize);
777 dwReturn = strlen((LPSTR)pOut);
782 strncpy((LPSTR)pOut, pszSrc, uOutSize);
783 dwReturn = strlen((LPSTR)pOut);
786 ERR(pidl,"-- unknown type\n");
789 TRACE(pidl,"-- (%p=%s 0x%08lx)\n",pOut,(char*)pOut,dwReturn);
794 /**************************************************************************
795 * _ILGetDataPointer()
797 LPPIDLDATA WINAPI _ILGetDataPointer(LPITEMIDLIST pidl)
801 /* TRACE(pidl,"(%p)\n", pidl);*/
802 return (LPPIDLDATA)(&pidl->mkid.abID);
804 /**************************************************************************
805 * _ILGetTextPointer()
806 * gets a pointer to the string stored in the pidl
808 LPSTR WINAPI _ILGetTextPointer(PIDLTYPE type, LPPIDLDATA pidldata)
809 {/* TRACE(pidl,"(type=%x data=%p)\n", type, pidldata);*/
816 return (LPSTR)&(pidldata->u.drive.szDriveName);
820 return (LPSTR)&(pidldata->u.file.szText);
825 /**************************************************************************
826 * IDLList "Item ID List List"
829 static UINT32 WINAPI IDLList_GetState(LPIDLLIST this);
830 static LPITEMIDLIST WINAPI IDLList_GetElement(LPIDLLIST this, UINT32 nIndex);
831 static UINT32 WINAPI IDLList_GetCount(LPIDLLIST this);
832 static BOOL32 WINAPI IDLList_StoreItem(LPIDLLIST this, LPITEMIDLIST pidl);
833 static BOOL32 WINAPI IDLList_AddItems(LPIDLLIST this, LPITEMIDLIST *apidl, UINT32 cidl);
834 static BOOL32 WINAPI IDLList_InitList(LPIDLLIST this);
835 static void WINAPI IDLList_CleanList(LPIDLLIST this);
837 static IDLList_VTable idllvt =
847 LPIDLLIST IDLList_Constructor (UINT32 uStep)
849 if (!(lpidll = (LPIDLLIST)HeapAlloc(GetProcessHeap(),0,sizeof(IDLList))))
852 lpidll->lpvtbl=&idllvt;
856 TRACE (shell,"(%p)\n",lpidll);
859 void IDLList_Destructor(LPIDLLIST this)
860 { TRACE (shell,"(%p)\n",this);
861 IDLList_CleanList(this);
864 static UINT32 WINAPI IDLList_GetState(LPIDLLIST this)
865 { TRACE (shell,"(%p)->(uStep=%u dpa=%p)\n",this, this->uStep, this->dpa);
867 if (this->uStep == 0)
870 return(State_OutOfMem);
872 return(State_UnInit);
874 static LPITEMIDLIST WINAPI IDLList_GetElement(LPIDLLIST this, UINT32 nIndex)
875 { TRACE (shell,"(%p)->(index=%u)\n",this, nIndex);
876 return((LPITEMIDLIST)DPA_GetPtr(this->dpa, nIndex));
878 static UINT32 WINAPI IDLList_GetCount(LPIDLLIST this)
879 { TRACE (shell,"(%p)\n",this);
880 return(IDLList_GetState(this)==State_Init ? DPA_GetPtrCount(this->dpa) : 0);
882 static BOOL32 WINAPI IDLList_StoreItem(LPIDLLIST this, LPITEMIDLIST pidl)
883 { TRACE (shell,"(%p)->(pidl=%p)\n",this, pidl);
885 { if (IDLList_InitList(this) && DPA_InsertPtr(this->dpa, 0x7fff, (LPSTR)pidl)>=0)
889 IDLList_CleanList(this);
892 static BOOL32 WINAPI IDLList_AddItems(LPIDLLIST this, LPITEMIDLIST *apidl, UINT32 cidl)
894 TRACE (shell,"(%p)->(apidl=%p cidl=%u)\n",this, apidl, cidl);
896 for (i=0; i<cidl; ++i)
897 { if (!IDLList_StoreItem(this, ILClone((LPCITEMIDLIST)apidl[i])))
902 static BOOL32 WINAPI IDLList_InitList(LPIDLLIST this)
903 { TRACE (shell,"(%p)\n",this);
904 switch (IDLList_GetState(this))
913 this->dpa = DPA_Create(this->uStep);
915 return(IDLList_InitList(this));
918 static void WINAPI IDLList_CleanList(LPIDLLIST this)
920 TRACE (shell,"(%p)\n",this);
922 if (this->uStep != 0)
932 for (i=DPA_GetPtrCount(this->dpa)-1; i>=0; --i)
933 { ILFree(IDLList_GetElement(this,i));
936 DPA_Destroy(this->dpa);