Add some comments to functions and minor fixes.

Export already existing (but still undocumented) functions
ILCreateFromPathA/W.
This commit is contained in:
Rolf Kalbermatter 2003-09-25 20:26:28 +00:00 committed by Alexandre Julliard
parent b8921a24ab
commit 5e46d9f9d7
2 changed files with 188 additions and 79 deletions

View file

@ -349,46 +349,59 @@ HRESULT WINAPI ILSaveToStream (IStream * pStream, LPCITEMIDLIST pPidl)
return ret; return ret;
} }
HRESULT WINAPI SHILCreateFromPathA (LPCSTR path, LPITEMIDLIST * ppidl, DWORD * attributes) /*************************************************************************
{ LPSHELLFOLDER sf; * SHILCreateFromPath [SHELL32.28]
*
* Create an ItemIDList from a path
*
* PARAMS
* path [I]
* ppidl [O]
* attributes [I/O] requested attributes on call and actual attributes when
* the function returns
*
* RETURNS
* NO_ERROR if successful, or an OLE errer code otherwise
*
* NOTES
* Wrapper for IShellFolder_ParseDisplayName().
*/
HRESULT WINAPI SHILCreateFromPathA(LPCSTR path, LPITEMIDLIST * ppidl, DWORD * attributes)
{
LPSHELLFOLDER sf;
WCHAR lpszDisplayName[MAX_PATH]; WCHAR lpszDisplayName[MAX_PATH];
DWORD pchEaten; DWORD pchEaten;
HRESULT ret = E_FAIL; HRESULT ret = E_FAIL;
TRACE_(shell)("%s %p 0x%08lx\n",path,ppidl,attributes?*attributes:0); TRACE_(shell)("%s %p 0x%08lx\n", path, ppidl, attributes ? *attributes : 0);
if (!MultiByteToWideChar( CP_ACP, 0, path, -1, lpszDisplayName, MAX_PATH )) if (!MultiByteToWideChar(CP_ACP, 0, path, -1, lpszDisplayName, MAX_PATH))
lpszDisplayName[MAX_PATH-1] = 0; lpszDisplayName[MAX_PATH-1] = 0;
if (SUCCEEDED (SHGetDesktopFolder(&sf))) if (SUCCEEDED (SHGetDesktopFolder(&sf)))
{ {
ret = IShellFolder_ParseDisplayName(sf,0, NULL,lpszDisplayName,&pchEaten,ppidl,attributes); ret = IShellFolder_ParseDisplayName(sf, 0, NULL, lpszDisplayName, &pchEaten, ppidl, attributes);
IShellFolder_Release(sf); IShellFolder_Release(sf);
} }
return ret; return ret;
} }
HRESULT WINAPI SHILCreateFromPathW (LPCWSTR path, LPITEMIDLIST * ppidl, DWORD * attributes) HRESULT WINAPI SHILCreateFromPathW(LPCWSTR path, LPITEMIDLIST * ppidl, DWORD * attributes)
{ LPSHELLFOLDER sf; {
LPSHELLFOLDER sf;
DWORD pchEaten; DWORD pchEaten;
HRESULT ret = E_FAIL; HRESULT ret = E_FAIL;
TRACE_(shell)("%s %p 0x%08lx\n",debugstr_w(path),ppidl,attributes?*attributes:0); TRACE_(shell)("%s %p 0x%08lx\n", debugstr_w(path), ppidl, attributes ? *attributes : 0);
if (SUCCEEDED (SHGetDesktopFolder(&sf))) if (SUCCEEDED (SHGetDesktopFolder(&sf)))
{ {
ret = IShellFolder_ParseDisplayName(sf,0, NULL, (LPWSTR) path, &pchEaten, ppidl, attributes); ret = IShellFolder_ParseDisplayName(sf, 0, NULL, (LPWSTR)path, &pchEaten, ppidl, attributes);
IShellFolder_Release(sf); IShellFolder_Release(sf);
} }
return ret; return ret;
} }
/*************************************************************************
* SHILCreateFromPath [SHELL32.28]
*
* NOTES
* Wrapper for IShellFolder_ParseDisplayName().
*/
HRESULT WINAPI SHILCreateFromPathAW (LPCVOID path, LPITEMIDLIST * ppidl, DWORD * attributes) HRESULT WINAPI SHILCreateFromPathAW (LPCVOID path, LPITEMIDLIST * ppidl, DWORD * attributes)
{ {
if ( SHELL_OsIsUnicode()) if ( SHELL_OsIsUnicode())
@ -397,30 +410,48 @@ HRESULT WINAPI SHILCreateFromPathAW (LPCVOID path, LPITEMIDLIST * ppidl, DWORD *
} }
/************************************************************************* /*************************************************************************
* SHCloneSpecialIDList [SHELL32.89] * SHCloneSpecialIDList [SHELL32.89]
* *
* PARAMETERS * Create an ItemIDList to one of the special folders.
* hwndOwner [in]
* nFolder [in] CSIDL_xxxxx ?? * PARAMS
* hwndOwner [in]
* nFolder [in] CSIDL_xxxxx
* fCreate [in] Create folder if it does not exist
* *
* RETURNS * RETURNS
* pidl ?? * Success: The newly created pidl
* Failure: NULL, if inputs are invalid.
*
* NOTES * NOTES
* exported by ordinal * exported by ordinal.
* Caller is responsible for deallocating the returned ItemIDList with the
* shells IMalloc interface, aka ILFree.
*/ */
LPITEMIDLIST WINAPI SHCloneSpecialIDList(HWND hwndOwner,DWORD nFolder,DWORD x3) LPITEMIDLIST WINAPI SHCloneSpecialIDList(HWND hwndOwner, DWORD nFolder, BOOL fCreate)
{ LPITEMIDLIST ppidl; { LPITEMIDLIST ppidl;
WARN_(shell)("(hwnd=%p,csidl=0x%lx,0x%lx):semi-stub.\n", TRACE_(shell)("(hwnd=%p,csidl=0x%lx,%s).\n", hwndOwner, nFolder, fCreate ? "T" : "F");
hwndOwner,nFolder,x3);
if (fCreate)
nFolder |= CSIDL_FLAG_CREATE;
SHGetSpecialFolderLocation(hwndOwner, nFolder, &ppidl); SHGetSpecialFolderLocation(hwndOwner, nFolder, &ppidl);
return ppidl; return ppidl;
} }
/************************************************************************* /*************************************************************************
* ILGlobalClone [SHELL32.20] * ILGlobalClone [SHELL32.20]
* *
* Clones an ItemIDList using Alloc.
*
* PARAMS
* pidl [I] ItemIDList to clone
*
* RETURNS
* Newly allocated ItemIDList.
*
* NOTES
* exported by ordinal.
*/ */
LPITEMIDLIST WINAPI ILGlobalClone(LPCITEMIDLIST pidl) LPITEMIDLIST WINAPI ILGlobalClone(LPCITEMIDLIST pidl)
{ DWORD len; { DWORD len;
@ -483,13 +514,26 @@ BOOL WINAPI ILIsEqual(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
return FALSE; return FALSE;
} }
/************************************************************************* /*************************************************************************
* ILIsParent [SHELL32.23] * ILIsParent [SHELL32.23]
* *
* parent=a/b child=a/b/c -> true, c is in folder a/b * Verifies that pidlParent is indeed the (immediate) parent of pidlChild.
* child=a/b/c/d -> false if bImmediate is true, d is not in folder a/b *
* child=a/b/c/d -> true if bImmediate is false, d is in a subfolder of a/b * PARAMS
* pidlParent [I]
* pidlChild [I]
* bImmediate [I] only return true if the parent is the direct parent
* of the child
*
* RETURNS
* True if the parent ItemIDlist is a complete part of the child ItemIdList,
* False otherwise.
*
* NOTES
* parent = a/b, child = a/b/c -> true, c is in folder a/b
* child = a/b/c/d -> false if bImmediate is true, d is not in folder a/b
* child = a/b/c/d -> true if bImmediate is false, d is in a subfolder of a/b
*/ */
BOOL WINAPI ILIsParent( LPCITEMIDLIST pidlParent, LPCITEMIDLIST pidlChild, BOOL bImmediate) BOOL WINAPI ILIsParent(LPCITEMIDLIST pidlParent, LPCITEMIDLIST pidlChild, BOOL bImmediate)
{ {
char szData1[MAX_PATH]; char szData1[MAX_PATH];
char szData2[MAX_PATH]; char szData2[MAX_PATH];
@ -511,26 +555,33 @@ BOOL WINAPI ILIsParent( LPCITEMIDLIST pidlParent, LPCITEMIDLIST pidlChild, BOOL
pChild = ILGetNext(pChild); pChild = ILGetNext(pChild);
} }
if ( pParent->mkid.cb || ! pChild->mkid.cb) /* child shorter or has equal length to parent */ if ( pParent->mkid.cb || ! pChild->mkid.cb) /* child shorter or has equal length to parent */
return FALSE; return FALSE;
if ( ILGetNext(pChild)->mkid.cb && bImmediate) /* not immediate descent */ if ( ILGetNext(pChild)->mkid.cb && bImmediate) /* not immediate descent */
return FALSE; return FALSE;
return TRUE; return TRUE;
} }
/************************************************************************* /*************************************************************************
* ILFindChild [SHELL32.24] * ILFindChild [SHELL32.24]
* *
* NOTES
* Compares elements from pidl1 and pidl2. * Compares elements from pidl1 and pidl2.
* *
* pidl1 is desktop pidl2 * PARAMS
* pidl1 shorter pidl2 pointer to first different element of pidl2 * pidl1 [I]
* if there was at least one equal element * pidl2 [I]
* pidl2 shorter pidl1 0 *
* pidl2 equal pidl1 pointer to last 0x00-element of pidl2 * RETURNS
* pidl1 is desktop pidl2
* pidl1 shorter pidl2 pointer to first different element of pidl2
* if there was at least one equal element
* pidl2 shorter pidl1 0
* pidl2 equal pidl1 pointer to last 0x00-element of pidl2
*
* NOTES
* exported by ordinal.
*/ */
LPITEMIDLIST WINAPI ILFindChild(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) LPITEMIDLIST WINAPI ILFindChild(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
{ {
@ -580,14 +631,25 @@ LPITEMIDLIST WINAPI ILFindChild(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
} }
/************************************************************************* /*************************************************************************
* ILCombine [SHELL32.25] * ILCombine [SHELL32.25]
*
* Concatenates two complex ItemIDLists.
*
* PARAMS
* pidl1 [I] first complex ItemIDLists
* pidl2 [I] complex ItemIDLists to append
*
* RETURNS
* if both pidl's == NULL NULL
* if pidl1 == NULL cloned pidl2
* if pidl2 == NULL cloned pidl1
* otherwise new pidl with pidl2 appended to pidl1
* *
* NOTES * NOTES
* Concatenates two complex idlists. * exported by ordinal.
* The pidl is the first one, pidlsub the next one * Does not destroy the passed in ItemIDLists!
* Does not destroy the passed in idlists!
*/ */
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1,LPCITEMIDLIST pidl2) LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
{ {
DWORD len1,len2; DWORD len1,len2;
LPITEMIDLIST pidlNew; LPITEMIDLIST pidlNew;
@ -654,14 +716,15 @@ LPITEMIDLIST WINAPI SHLogILFromFSIL(LPITEMIDLIST pidl)
} }
/************************************************************************* /*************************************************************************
* ILGetSize [SHELL32.152] * ILGetSize [SHELL32.152]
* gets the byte size of an idlist including zero terminator (pidl)
* *
* PARAMETERS * Gets the byte size of an ItemIDList including zero terminator
* pidl ITEMIDLIST *
* PARAMS
* pidl [I] ItemIDList
* *
* RETURNS * RETURNS
* size of pidl * size of pidl in bytes
* *
* NOTES * NOTES
* exported by ordinal * exported by ordinal
@ -683,14 +746,20 @@ DWORD WINAPI ILGetSize(LPCITEMIDLIST pidl)
} }
/************************************************************************* /*************************************************************************
* ILGetNext [SHELL32.153] * ILGetNext [SHELL32.153]
* gets the next simple pidl of a complex pidl
* *
* observed return values: * Gets the next ItemID of an ItemIDList
*
* PARAMS
* pidl [I] ItemIDList
*
* RETURNS
* null -> null * null -> null
* desktop -> null * desktop -> null
* simple pidl -> pointer to 0x0000 element * simple pidl -> pointer to 0x0000 element
* *
* NOTES
* exported by ordinal.
*/ */
LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST pidl) LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST pidl)
{ {
@ -710,16 +779,23 @@ LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST pidl)
} }
return NULL; return NULL;
} }
/************************************************************************* /*************************************************************************
* ILAppend [SHELL32.154] * ILAppend [SHELL32.154]
*
* Adds the single ItemID item to the ItemIDList indicated by pidl.
* If bEnd is FALSE, inserts the item in the front of the list,
* otherwise it adds the item to the end. (???)
*
* PARAMS
* pidl [I] ItemIDList to extend
* item [I] ItemID to prepend/append
* bEnd [I] Indicates if the item should be appended
* *
* NOTES * NOTES
* Adds the single item to the idlist indicated by pidl.
* if bEnd is 0, adds the item to the front of the list,
* otherwise adds the item to the end. (???)
* Destroys the passed in idlist! (???) * Destroys the passed in idlist! (???)
*/ */
LPITEMIDLIST WINAPI ILAppend(LPITEMIDLIST pidl,LPCITEMIDLIST item,BOOL bEnd) LPITEMIDLIST WINAPI ILAppend(LPITEMIDLIST pidl, LPCITEMIDLIST item, BOOL bEnd)
{ {
LPITEMIDLIST idlRet; LPITEMIDLIST idlRet;
@ -738,23 +814,27 @@ LPITEMIDLIST WINAPI ILAppend(LPITEMIDLIST pidl,LPCITEMIDLIST item,BOOL bEnd)
if (bEnd) if (bEnd)
{ {
idlRet=ILCombine(pidl,item); idlRet = ILCombine(pidl, item);
} }
else else
{ {
idlRet=ILCombine(item,pidl); idlRet = ILCombine(item, pidl);
} }
SHFree(pidl); SHFree(pidl);
return idlRet; return idlRet;
} }
/************************************************************************* /*************************************************************************
* ILFree [SHELL32.155] * ILFree [SHELL32.155]
*
* Frees memory (if not NULL) allocated by SHMalloc allocator
*
* PARAMS
* pidl [I]
* *
* NOTES * NOTES
* free_check_ptr - frees memory (if not NULL) * exported by ordinal
* allocated by SHMalloc allocator
* exported by ordinal
*/ */
DWORD WINAPI ILFree(LPITEMIDLIST pidl) DWORD WINAPI ILFree(LPITEMIDLIST pidl)
{ {
@ -764,49 +844,76 @@ DWORD WINAPI ILFree(LPITEMIDLIST pidl)
SHFree(pidl); SHFree(pidl);
return TRUE; return TRUE;
} }
/************************************************************************* /*************************************************************************
* ILGlobalFree [SHELL32.156] * ILGlobalFree [SHELL32.156]
* *
* Frees memory (if not NULL) allocated by Alloc allocator
*
* PARAMS
* pidl [I]
*
* NOTES
* exported by ordinal.
*/ */
void WINAPI ILGlobalFree( LPITEMIDLIST pidl) void WINAPI ILGlobalFree( LPITEMIDLIST pidl)
{ {
TRACE("%p\n",pidl); TRACE("%p\n", pidl);
if(!pidl) return; if(!pidl) return;
Free(pidl); Free(pidl);
} }
/************************************************************************* /*************************************************************************
* ILCreateFromPath [SHELL32.157] * ILCreateFromPathA [SHELL32.189]
* *
* Creates a complex ItemIDList from a path and returns it.
*
* PARAMS
* path [I]
*
* RETURNS
* the newly created complex ItemIDList or NULL if failed
*
* NOTES
* exported by ordinal.
*/ */
LPITEMIDLIST WINAPI ILCreateFromPathA (LPCSTR path) LPITEMIDLIST WINAPI ILCreateFromPathA (LPCSTR path)
{ {
LPITEMIDLIST pidlnew; LPITEMIDLIST pidlnew = NULL;
DWORD attributes = 0;
TRACE_(shell)("%s\n",path); TRACE_(shell)("%s\n", debugstr_a(path));
if (SUCCEEDED (SHILCreateFromPathA (path, &pidlnew, &attributes))) if (SUCCEEDED(SHILCreateFromPathA(path, &pidlnew, NULL)))
return pidlnew; return pidlnew;
return FALSE; return NULL;
} }
/*************************************************************************
* ILCreateFromPathW [SHELL32.190]
*/
LPITEMIDLIST WINAPI ILCreateFromPathW (LPCWSTR path) LPITEMIDLIST WINAPI ILCreateFromPathW (LPCWSTR path)
{ {
LPITEMIDLIST pidlnew; LPITEMIDLIST pidlnew = NULL;
DWORD attributes = 0;
TRACE_(shell)("%s\n",debugstr_w(path)); TRACE_(shell)("%s\n", debugstr_w(path));
if (SUCCEEDED (SHILCreateFromPathW (path, &pidlnew, &attributes))) if (SUCCEEDED(SHILCreateFromPathW(path, &pidlnew, NULL)))
return pidlnew; return pidlnew;
return FALSE; return NULL;
} }
/*************************************************************************
* ILCreateFromPath [SHELL32.157]
*/
LPITEMIDLIST WINAPI ILCreateFromPathAW (LPCVOID path) LPITEMIDLIST WINAPI ILCreateFromPathAW (LPCVOID path)
{ {
if ( SHELL_OsIsUnicode()) if ( SHELL_OsIsUnicode())
return ILCreateFromPathW (path); return ILCreateFromPathW (path);
return ILCreateFromPathA (path); return ILCreateFromPathA (path);
} }
/************************************************************************* /*************************************************************************
* _ILParsePathW [internal] * _ILParsePathW [internal]
* *

View file

@ -89,7 +89,7 @@
95 stdcall SHLogILFromFSIL (ptr) 95 stdcall SHLogILFromFSIL (ptr)
96 stdcall StrRetToStrN (ptr long ptr ptr) StrRetToStrNAW 96 stdcall StrRetToStrN (ptr long ptr ptr) StrRetToStrNAW
97 stdcall SHWaitForFileToOpen (long long long) 97 stdcall SHWaitForFileToOpen (long long long)
98 stdcall SHGetRealIDL (long long long) 98 stdcall SHGetRealIDL (ptr ptr ptr)
99 stdcall SetAppStartingCursor (long long) 99 stdcall SetAppStartingCursor (long long)
100 stdcall SHRestricted(long) 100 stdcall SHRestricted(long)
102 stdcall SHCoCreateInstance(ptr ptr long ptr ptr) 102 stdcall SHCoCreateInstance(ptr ptr long ptr ptr)
@ -174,6 +174,8 @@
184 stdcall ArrangeWindows(long long long long long) 184 stdcall ArrangeWindows(long long long long long)
185 stub SHHandleDiskFull 185 stub SHHandleDiskFull
186 stdcall ILGetDisplayNameEx(ptr ptr ptr long) 186 stdcall ILGetDisplayNameEx(ptr ptr ptr long)
189 stdcall ILCreateFromPathA(str)
190 stdcall ILCreateFromPathW(wstr)
195 stdcall SHFree(ptr) 195 stdcall SHFree(ptr)
196 stdcall SHAlloc(long) 196 stdcall SHAlloc(long)
197 stub SHGlobalDefect 197 stub SHGlobalDefect