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