Aric Stewart : shell32: In ParseDisplayName make use of shdocvw if the display name is not a drive but has a :.
Alexandre Julliard
julliard at winehq.org
Thu Jan 29 09:14:45 CST 2009
Module: wine
Branch: master
Commit: c6ba4eed013358a84bd72c25c6a0b572041cad97
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c6ba4eed013358a84bd72c25c6a0b572041cad97
Author: Aric Stewart <aric at codeweavers.com>
Date: Wed Jan 28 10:32:38 2009 -0600
shell32: In ParseDisplayName make use of shdocvw if the display name is not a drive but has a :.
---
dlls/shell32/Makefile.in | 2 +-
dlls/shell32/shfldr_desktop.c | 8 ++++++++
dlls/shell32/tests/shlfolder.c | 26 ++++++++++++++++++++++++++
3 files changed, 35 insertions(+), 1 deletions(-)
diff --git a/dlls/shell32/Makefile.in b/dlls/shell32/Makefile.in
index 8a3ee40..4fe4300 100644
--- a/dlls/shell32/Makefile.in
+++ b/dlls/shell32/Makefile.in
@@ -6,7 +6,7 @@ VPATH = @srcdir@
MODULE = shell32.dll
IMPORTLIB = shell32
IMPORTS = uuid shlwapi comctl32 user32 gdi32 advapi32 kernel32 ntdll
-DELAYIMPORTS = ole32 oleaut32
+DELAYIMPORTS = ole32 oleaut32 shdocvw
C_SRCS = \
appbar.c \
diff --git a/dlls/shell32/shfldr_desktop.c b/dlls/shell32/shfldr_desktop.c
index aeb6e4b..c9b7412 100644
--- a/dlls/shell32/shfldr_desktop.c
+++ b/dlls/shell32/shfldr_desktop.c
@@ -55,6 +55,10 @@
WINE_DEFAULT_DEBUG_CHANNEL (shell);
+/* Undocumented functions from shdocvw */
+extern HRESULT WINAPI IEParseDisplayNameWithBCW(DWORD codepage, LPCWSTR lpszDisplayName, LPBC pbc, LPITEMIDLIST *ppidl);
+
+
/***********************************************************************
* Desktopfolder implementation
*/
@@ -181,6 +185,10 @@ static HRESULT WINAPI ISF_Desktop_fnParseDisplayName (IShellFolder2 * iface,
*ppidl = pidlTemp;
return S_OK;
}
+ else if (strchrW(lpszDisplayName,':'))
+ {
+ return IEParseDisplayNameWithBCW(CP_ACP,lpszDisplayName,pbc,ppidl);
+ }
else
{
/* it's a filesystem path on the desktop. Let a FSFolder parse it */
diff --git a/dlls/shell32/tests/shlfolder.c b/dlls/shell32/tests/shlfolder.c
index cc32a00..9d563e0 100644
--- a/dlls/shell32/tests/shlfolder.c
+++ b/dlls/shell32/tests/shlfolder.c
@@ -82,6 +82,8 @@ static void test_ParseDisplayName(void)
IShellFolder *IDesktopFolder;
static const char *cNonExistDir1A = "c:\\nonexist_subdir";
static const char *cNonExistDir2A = "c:\\\\nonexist_subdir";
+ static const char *cInetTestA = "http:\\yyy";
+ static const char *cInetTest2A = "xx:yyy";
DWORD res;
WCHAR cTestDirW [MAX_PATH] = {0};
ITEMIDLIST *newPIDL;
@@ -90,6 +92,30 @@ static void test_ParseDisplayName(void)
hr = SHGetDesktopFolder(&IDesktopFolder);
if(hr != S_OK) return;
+ MultiByteToWideChar(CP_ACP, 0, cInetTestA, -1, cTestDirW, MAX_PATH);
+ hr = IShellFolder_ParseDisplayName(IDesktopFolder,
+ NULL, NULL, cTestDirW, NULL, &newPIDL, 0);
+ todo_wine ok((SUCCEEDED(hr) || broken(hr == E_FAIL) /* NT4 */),
+ "ParseDisplayName returned %08x, expected SUCCESS or E_FAIL \n", hr);
+ if (SUCCEEDED(hr))
+ {
+ ok(pILFindLastID(newPIDL)->mkid.abID[0] == 0x61, "Last pidl should be of type "
+ "PT_IESPECIAL1, but is: %02x\n", pILFindLastID(newPIDL)->mkid.abID[0]);
+ IMalloc_Free(ppM, newPIDL);
+ }
+
+ MultiByteToWideChar(CP_ACP, 0, cInetTest2A, -1, cTestDirW, MAX_PATH);
+ hr = IShellFolder_ParseDisplayName(IDesktopFolder,
+ NULL, NULL, cTestDirW, NULL, &newPIDL, 0);
+ todo_wine ok((SUCCEEDED(hr) || broken(hr == E_FAIL) /* NT4 */),
+ "ParseDisplayName returned %08x, expected SUCCESS or E_FAIL \n", hr);
+ if (SUCCEEDED(hr))
+ {
+ ok(pILFindLastID(newPIDL)->mkid.abID[0] == 0x61, "Last pidl should be of type "
+ "PT_IESPECIAL1, but is: %02x\n", pILFindLastID(newPIDL)->mkid.abID[0]);
+ IMalloc_Free(ppM, newPIDL);
+ }
+
res = GetFileAttributesA(cNonExistDir1A);
if(res != INVALID_FILE_ATTRIBUTES) return;
More information about the wine-cvs
mailing list