Jacek Caban : shell32: Added SHGetPathFromIDListEx implementation.

Alexandre Julliard julliard at winehq.org
Thu Feb 23 16:27:51 CST 2017


Module: wine
Branch: master
Commit: d9fc7d271c570a604c2d1d7db4c45a17b3cafaf2
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=d9fc7d271c570a604c2d1d7db4c45a17b3cafaf2

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Feb 23 15:42:49 2017 +0100

shell32: Added SHGetPathFromIDListEx implementation.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/shell32/pidl.c            | 19 +++++++++++++++----
 dlls/shell32/shell32.spec      |  1 +
 dlls/shell32/tests/shlfolder.c | 32 +++++++++++++++++++++++++++++---
 3 files changed, 45 insertions(+), 7 deletions(-)

diff --git a/dlls/shell32/pidl.c b/dlls/shell32/pidl.c
index c3a753a..72169d5 100644
--- a/dlls/shell32/pidl.c
+++ b/dlls/shell32/pidl.c
@@ -1245,16 +1245,27 @@ BOOL WINAPI SHGetPathFromIDListA(LPCITEMIDLIST pidl, LPSTR pszPath)
  */
 BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
 {
+    return SHGetPathFromIDListEx(pidl, pszPath, MAX_PATH, 0);
+}
+
+/*************************************************************************
+ * SHGetPathFromIDListEx             [SHELL32.@]
+ */
+BOOL WINAPI SHGetPathFromIDListEx(LPCITEMIDLIST pidl, WCHAR *path, DWORD path_size, GPFIDL_FLAGS flags)
+{
     HRESULT hr;
     LPCITEMIDLIST pidlLast;
     LPSHELLFOLDER psfFolder;
     DWORD dwAttributes;
     STRRET strret;
 
-    TRACE_(shell)("(pidl=%p,%p)\n", pidl, pszPath);
+    TRACE_(shell)("(pidl=%p,%p,%u,%x)\n", pidl, path, path_size, flags);
     pdump(pidl);
 
-    *pszPath = '\0';
+    if (flags != GPFIDL_DEFAULT)
+        FIXME("Unsupported flags %x\n", flags);
+
+    *path = '\0';
     if (!pidl)
         return FALSE;
 
@@ -1272,9 +1283,9 @@ BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
     IShellFolder_Release(psfFolder);
     if (FAILED(hr)) return FALSE;
 
-    hr = StrRetToBufW(&strret, pidlLast, pszPath, MAX_PATH);
+    hr = StrRetToBufW(&strret, pidlLast, path, path_size);
 
-    TRACE_(shell)("-- %s, 0x%08x\n",debugstr_w(pszPath), hr);
+    TRACE_(shell)("-- %s, 0x%08x\n",debugstr_w(path), hr);
     return SUCCEEDED(hr);
 }
 
diff --git a/dlls/shell32/shell32.spec b/dlls/shell32/shell32.spec
index f758b3c..780fa50 100644
--- a/dlls/shell32/shell32.spec
+++ b/dlls/shell32/shell32.spec
@@ -390,6 +390,7 @@
 @ stdcall SHGetNewLinkInfo(str str ptr ptr long) SHGetNewLinkInfoA
 @ stdcall SHGetPathFromIDList(ptr ptr) SHGetPathFromIDListA
 @ stdcall SHGetPathFromIDListA(ptr ptr)
+@ stdcall SHGetPathFromIDListEx(ptr ptr long long)
 @ stdcall SHGetPathFromIDListW(ptr ptr)
 @ stdcall SHGetPropertyStoreForWindow(long ptr ptr)
 @ stdcall SHGetPropertyStoreFromParsingName(wstr ptr long ptr ptr)
diff --git a/dlls/shell32/tests/shlfolder.c b/dlls/shell32/tests/shlfolder.c
index 90418bd..759cce6 100644
--- a/dlls/shell32/tests/shlfolder.c
+++ b/dlls/shell32/tests/shlfolder.c
@@ -76,6 +76,7 @@ static HRESULT (WINAPI *pSHCreateDefaultContextMenu)(const DEFCONTEXTMENU*,REFII
 static HRESULT (WINAPI *pSHCreateShellFolderView)(const SFV_CREATE *pcsfv, IShellView **ppsv);
 static HRESULT (WINAPI *pSHCreateShellFolderViewEx)(LPCSFV psvcbi, IShellView **ppv);
 static HRESULT (WINAPI *pSHILCreateFromPath)(LPCWSTR, LPITEMIDLIST *,DWORD*);
+static BOOL (WINAPI *pSHGetPathFromIDListEx)(PCIDLIST_ABSOLUTE,WCHAR*,DWORD,GPFIDL_FLAGS);
 
 static WCHAR *make_wstr(const char *str)
 {
@@ -135,6 +136,7 @@ static void init_function_pointers(void)
     MAKEFUNC(SHCreateDefaultContextMenu);
     MAKEFUNC(SHCreateShellFolderView);
     MAKEFUNC(SHCreateShellFolderViewEx);
+    MAKEFUNC(SHGetPathFromIDListEx);
 #undef MAKEFUNC
 
 #define MAKEFUNC_ORD(f, ord) (p##f = (void*)GetProcAddress(hmod, (LPSTR)(ord)))
@@ -1347,10 +1349,34 @@ static void test_SHGetPathFromIDList(void)
 
     result = pSHGetPathFromIDListW(pidlTestFile, wszPath);
     ok(result, "SHGetPathFromIDListW failed! Last error: %u\n", GetLastError());
-    IMalloc_Free(ppM, pidlTestFile);
-    if (!result) return;
     ok(0 == lstrcmpW(wszFileName, wszPath), "SHGetPathFromIDListW returned incorrect path for file placed on desktop\n");
 
+    if (pSHGetPathFromIDListEx)
+    {
+        result = pSHGetPathFromIDListEx(pidlEmpty, wszPath, MAX_PATH, SFGAO_FILESYSTEM);
+        ok(result, "SHGetPathFromIDListEx failed: %u\n", GetLastError());
+        ok(!lstrcmpiW(wszDesktop, wszPath), "Unexpected SHGetPathFromIDListEx result %s, expected %s\n",
+           wine_dbgstr_w(wszPath), wine_dbgstr_w(wszDesktop));
+
+        result = pSHGetPathFromIDListEx(pidlTestFile, wszPath, MAX_PATH, SFGAO_FILESYSTEM);
+        ok(result, "SHGetPathFromIDListEx failed: %u\n", GetLastError());
+        ok(!lstrcmpiW(wszFileName, wszPath), "Unexpected SHGetPathFromIDListEx result %s, expected %s\n",
+           wine_dbgstr_w(wszPath), wine_dbgstr_w(wszFileName));
+
+        SetLastError(0xdeadbeef);
+        memset(wszPath, 0x55, sizeof(wszPath));
+        result = pSHGetPathFromIDListEx(pidlTestFile, wszPath, 5, SFGAO_FILESYSTEM);
+        ok(!result, "SHGetPathFromIDListEx returned: %x(%u)\n", result, GetLastError());
+
+        SetLastError(0xdeadbeef);
+        memset(wszPath, 0x55, sizeof(wszPath));
+        result = pSHGetPathFromIDListEx(pidlEmpty, wszPath, 5, SFGAO_FILESYSTEM);
+        ok(!result, "SHGetPathFromIDListEx returned: %x(%u)\n", result, GetLastError());
+    }
+    else
+        win_skip("SHGetPathFromIDListEx not available\n");
+
+    IMalloc_Free(ppM, pidlTestFile);
 
     /* Test if we can get the path from the start menu "program files" PIDL. */
     hr = pSHGetSpecialFolderLocation(NULL, CSIDL_PROGRAM_FILES, &pidlPrograms);
@@ -1358,7 +1384,7 @@ static void test_SHGetPathFromIDList(void)
 
     SetLastError(0xdeadbeef);
     result = pSHGetPathFromIDListW(pidlPrograms, wszPath);
-	IMalloc_Free(ppM, pidlPrograms);
+    IMalloc_Free(ppM, pidlPrograms);
     ok(result, "SHGetPathFromIDListW failed\n");
 }
 




More information about the wine-cvs mailing list