shell32: export some already implemented functions

Rolf Kalbermatter rolf.kalbermatter at citeng.com
Mon Sep 22 11:11:37 CDT 2003


Changelog
  - dlls/shell32/pidl.c
    Add some comments to functions and minor fixes
  - dlls/shell32/shell32.spec
    Export already existing (but still undocumented) functions ILCreateFromPathA/W

License: X11

Rolf Kalbermatter
 
Index: dlls/shell32/pidl.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/pidl.c,v
retrieving revision 1.89
diff -u -r1.89 pidl.c
--- dlls/shell32/pidl.c	17 Sep 2003 04:17:33 -0000	1.89
+++ dlls/shell32/pidl.c	19 Sep 2003 10:50:50 -0000
@@ -349,46 +349,59 @@
 	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];
 	DWORD pchEaten;
 	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 ))
-            lpszDisplayName[MAX_PATH-1] = 0;
+	if (!MultiByteToWideChar(CP_ACP, 0, path, -1, lpszDisplayName, MAX_PATH))
+	  lpszDisplayName[MAX_PATH-1] = 0;
 
 	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);
 	}
 	return ret;
 }
 
-HRESULT WINAPI SHILCreateFromPathW (LPCWSTR path, LPITEMIDLIST * ppidl, DWORD * attributes)
-{	LPSHELLFOLDER sf;
+HRESULT WINAPI SHILCreateFromPathW(LPCWSTR path, LPITEMIDLIST * ppidl, DWORD * attributes)
+{
+	LPSHELLFOLDER sf;
 	DWORD pchEaten;
 	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)))
 	{
-	  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);
 	}
 	return ret;
 }
 
-/*************************************************************************
- * SHILCreateFromPath   [SHELL32.28]
- *
- * NOTES
- *   Wrapper for IShellFolder_ParseDisplayName().
- */
 HRESULT WINAPI SHILCreateFromPathAW (LPCVOID path, LPITEMIDLIST * ppidl, DWORD * attributes)
 {
 	if ( SHELL_OsIsUnicode())
@@ -397,30 +410,48 @@
 }
 
 /*************************************************************************
- * SHCloneSpecialIDList [SHELL32.89]
+ * SHCloneSpecialIDList      [SHELL32.89]
  *
- * PARAMETERS
- *  hwndOwner 	[in]
- *  nFolder 	[in]	CSIDL_xxxxx ??
+ * Create an ItemIDList to one of the special folders.
+
+ * PARAMS
+ *  hwndOwner	[in]
+ *  nFolder		[in]	CSIDL_xxxxx
+ *  fCreate		[in]	Create folder if it does not exist
  *
  * RETURNS
- *  pidl ??
+ *  Success: The newly created pidl
+ *  Failure: NULL, if inputs are invalid.
+ *
  * 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;
-	WARN_(shell)("(hwnd=%p,csidl=0x%lx,0x%lx):semi-stub.\n",
-					 hwndOwner,nFolder,x3);
+	TRACE_(shell)("(hwnd=%p,csidl=0x%lx,%s).\n", hwndOwner, nFolder, fCreate ? "T" : "F");
 
-	SHGetSpecialFolderLocation(hwndOwner, nFolder, &ppidl);
+	if (fCreate)
+	  nFolder |= CSIDL_FLAG_CREATE;
 
+	SHGetSpecialFolderLocation(hwndOwner, nFolder, &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)
 {	DWORD    len;
@@ -483,13 +514,26 @@
 	return FALSE;
 }
 /*************************************************************************
- * ILIsParent [SHELL32.23]
+ * ILIsParent                [SHELL32.23]
+ *
+ * Verifies that pidlParent is indeed the (immediate) parent of pidlChild.
  *
- * 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
+ * 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	szData2[MAX_PATH];
@@ -511,26 +555,33 @@
 	  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;
 
-	if ( ILGetNext(pChild)->mkid.cb && bImmediate)	/* not immediate descent */
+	if ( ILGetNext(pChild)->mkid.cb && bImmediate) /* not immediate descent */
 	  return FALSE;
 
 	return TRUE;
 }
 
 /*************************************************************************
- * ILFindChild [SHELL32.24]
+ * ILFindChild               [SHELL32.24]
  *
- * NOTES
  *  Compares elements from pidl1 and pidl2.
  *
- *  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
+ * PARAMS
+ *  pidl1      [I]
+ *  pidl2      [I]
+ *
+ * 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)
 {
@@ -580,14 +631,25 @@
 }
 
 /*************************************************************************
- * 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
- *  Concatenates two complex idlists.
- *  The pidl is the first one, pidlsub the next one
- *  Does not destroy the passed in idlists!
+ *  exported by ordinal.
+ *  Does not destroy the passed in ItemIDLists!
  */
-LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1,LPCITEMIDLIST pidl2)
+LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
 {
 	DWORD    len1,len2;
 	LPITEMIDLIST  pidlNew;
@@ -654,14 +716,15 @@
 }
 
 /*************************************************************************
- * ILGetSize [SHELL32.152]
- *  gets the byte size of an idlist including zero terminator (pidl)
+ * ILGetSize                 [SHELL32.152]
  *
- * PARAMETERS
- *  pidl ITEMIDLIST
+ * Gets the byte size of an ItemIDList including zero terminator
+ *
+ * PARAMS
+ *  pidl       [I]   ItemIDList
  *
  * RETURNS
- *  size of pidl
+ *  size of pidl in bytes
  *
  * NOTES
  *  exported by ordinal
@@ -683,14 +746,20 @@
 }
 
 /*************************************************************************
- * ILGetNext [SHELL32.153]
- *  gets the next simple pidl of a complex pidl
+ * ILGetNext                 [SHELL32.153]
+ *
+ * Gets the next ItemID of an ItemIDList
  *
- * observed return values:
+ * PARAMS
+ *  pidl       [I]   ItemIDList
+ *
+ * RETURNS
  *  null -> null
  *  desktop -> null
  *  simple pidl -> pointer to 0x0000 element
  *
+ * NOTES
+ *  exported by ordinal.
  */
 LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST pidl)
 {
@@ -710,16 +779,23 @@
 	}
 	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
- *  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! (???)
  */
-LPITEMIDLIST WINAPI ILAppend(LPITEMIDLIST pidl,LPCITEMIDLIST item,BOOL bEnd)
+LPITEMIDLIST WINAPI ILAppend(LPITEMIDLIST pidl, LPCITEMIDLIST item, BOOL bEnd)
 {
 	LPITEMIDLIST idlRet;
 
@@ -738,23 +814,27 @@
 
 	if (bEnd)
 	{
-	  idlRet=ILCombine(pidl,item);
+	  idlRet = ILCombine(pidl, item);
 	}
 	else
 	{
-	  idlRet=ILCombine(item,pidl);
+	  idlRet = ILCombine(item, pidl);
 	}
 
 	SHFree(pidl);
 	return idlRet;
 }
+
 /*************************************************************************
- * ILFree [SHELL32.155]
+ * ILFree                    [SHELL32.155]
+ *
+ * Frees memory (if not NULL) allocated by SHMalloc allocator
+ *
+ * PARAMS
+ *  pidl         [I]
  *
  * NOTES
- *     free_check_ptr - frees memory (if not NULL)
- *     allocated by SHMalloc allocator
- *     exported by ordinal
+ *  exported by ordinal
  */
 DWORD WINAPI ILFree(LPITEMIDLIST pidl)
 {
@@ -764,49 +844,76 @@
 	SHFree(pidl);
 	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)
 {
-	TRACE("%p\n",pidl);
+	TRACE("%p\n", pidl);
 
 	if(!pidl) return;
 	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 pidlnew;
-	DWORD attributes = 0;
+	LPITEMIDLIST pidlnew = NULL;
 
-	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 FALSE;
+	return NULL;
 }
+
+/*************************************************************************
+ * ILCreateFromPathW         [SHELL32.190]
+ */
 LPITEMIDLIST WINAPI ILCreateFromPathW (LPCWSTR path)
 {
-	LPITEMIDLIST pidlnew;
-	DWORD attributes = 0;
+	LPITEMIDLIST pidlnew = NULL;
 
-	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 FALSE;
+	return NULL;
 }
+
+/*************************************************************************
+ * ILCreateFromPath          [SHELL32.157]
+ */
 LPITEMIDLIST WINAPI ILCreateFromPathAW (LPCVOID path)
 {
 	if ( SHELL_OsIsUnicode())
 	  return ILCreateFromPathW (path);
 	return ILCreateFromPathA (path);
 }
+
 /*************************************************************************
  * _ILParsePathW             [internal]
  *
Index: dlls/shell32/shell32.spec
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shell32.spec,v
retrieving revision 1.75
diff -u -r1.75 shell32.spec
--- dlls/shell32/shell32.spec	21 Aug 2003 21:26:07 -0000	1.75
+++ dlls/shell32/shell32.spec	19 Sep 2003 10:59:21 -0000
@@ -89,9 +89,9 @@
   95 stdcall SHLogILFromFSIL (ptr)
   96 stdcall StrRetToStrN (ptr long ptr ptr) StrRetToStrNAW
   97 stdcall SHWaitForFileToOpen (long long long)
-  98 stdcall SHGetRealIDL (long long long)
+  98 stdcall -noname SHGetRealIDL (ptr ptr ptr)
   99 stdcall SetAppStartingCursor (long long)
  100 stdcall SHRestricted(long)
  102 stdcall SHCoCreateInstance(ptr ptr long ptr ptr)
@@ -174,6 +174,8 @@
  184 stdcall ArrangeWindows(long long long long long)
  185 stub SHHandleDiskFull
  186 stdcall ILGetDisplayNameEx(ptr ptr ptr long)
+ 189 stdcall -noname ILCreateFromPathA(str)
+ 190 stdcall -noname ILCreateFromPathW(wstr)
  195 stdcall SHFree(ptr)
  196 stdcall SHAlloc(long)
  197 stub SHGlobalDefect





More information about the wine-patches mailing list