We should store full path in folder object similar like we already do for file object.
From: Robert Wilhelm robert.wilhelm@gmx.net
--- dlls/scrrun/tests/filesystem.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/dlls/scrrun/tests/filesystem.c b/dlls/scrrun/tests/filesystem.c index 59f5859c556..98652ecf523 100644 --- a/dlls/scrrun/tests/filesystem.c +++ b/dlls/scrrun/tests/filesystem.c @@ -27,6 +27,7 @@ #include "olectl.h" #include "oleauto.h" #include "dispex.h" +#include "shlwapi.h"
#include "wine/test.h"
@@ -927,7 +928,9 @@ static void test_BuildPath(void)
static void test_GetFolder(void) { - WCHAR buffW[MAX_PATH]; + static const WCHAR dir[] = L"test_dir"; + + WCHAR buffW[MAX_PATH], temp_path[MAX_PATH], prev_path[MAX_PATH]; IFolder *folder; HRESULT hr; BSTR str; @@ -959,6 +962,22 @@ static void test_GetFolder(void) SysFreeString(str); test_provideclassinfo(folder, &CLSID_Folder); IFolder_Release(folder); + + GetCurrentDirectoryW(MAX_PATH, prev_path); + GetTempPathW(MAX_PATH, temp_path); + SetCurrentDirectoryW(temp_path); + ok(CreateDirectoryW(dir, NULL), "CreateDirectory(%s) failed\n", wine_dbgstr_w(dir)); + str = SysAllocString(dir); + hr = IFileSystem3_GetFolder(fs3, str, &folder); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + SysFreeString(str); + hr = IFolder_get_Path(folder, &str); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine ok(!PathIsRelativeW(str), "path %s is relative.\n", wine_dbgstr_w(str)); + SysFreeString(str); + IFolder_Release(folder); + RemoveDirectoryW(dir); + SetCurrentDirectoryW(prev_path); }
static void _test_clone(IEnumVARIANT *enumvar, BOOL position_inherited, LONG count, int line)
From: Robert Wilhelm robert.wilhelm@gmx.net
--- dlls/scrrun/filesystem.c | 20 ++++++++++++++++++-- dlls/scrrun/tests/filesystem.c | 2 +- 2 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/dlls/scrrun/filesystem.c b/dlls/scrrun/filesystem.c index 7a8a7689902..cfeb5bb1532 100644 --- a/dlls/scrrun/filesystem.c +++ b/dlls/scrrun/filesystem.c @@ -2699,6 +2699,7 @@ static const IFolderVtbl foldervtbl = { HRESULT create_folder(const WCHAR *path, IFolder **folder) { struct folder *object; + DWORD len;
*folder = NULL;
@@ -2709,13 +2710,28 @@ HRESULT create_folder(const WCHAR *path, IFolder **folder)
object->IFolder_iface.lpVtbl = &foldervtbl; object->ref = 1; - object->path = SysAllocString(path); - if (!object->path) + + len = GetFullPathNameW(path, 0, NULL, NULL); + if (!len) + { + free(object); + return E_FAIL; + } + + object->path = SysAllocStringLen(NULL, len); + if(!object->path) { free(object); return E_OUTOFMEMORY; }
+ if (!GetFullPathNameW(path, len, object->path, NULL)) + { + SysFreeString(object->path); + free(object); + return E_FAIL; + } + init_classinfo(&CLSID_Folder, (IUnknown *)&object->IFolder_iface, &object->classinfo); *folder = &object->IFolder_iface;
diff --git a/dlls/scrrun/tests/filesystem.c b/dlls/scrrun/tests/filesystem.c index 98652ecf523..f2e23e4011c 100644 --- a/dlls/scrrun/tests/filesystem.c +++ b/dlls/scrrun/tests/filesystem.c @@ -973,7 +973,7 @@ static void test_GetFolder(void) SysFreeString(str); hr = IFolder_get_Path(folder, &str); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(!PathIsRelativeW(str), "path %s is relative.\n", wine_dbgstr_w(str)); + ok(!PathIsRelativeW(str), "path %s is relative.\n", wine_dbgstr_w(str)); SysFreeString(str); IFolder_Release(folder); RemoveDirectoryW(dir);
This merge request was approved by Nikolay Sivov.