diff --git a/dlls/shlwapi/path.c b/dlls/shlwapi/path.c index dc7bc4b7ad6..415ae29827a 100644 --- a/dlls/shlwapi/path.c +++ b/dlls/shlwapi/path.c @@ -3419,6 +3419,26 @@ HRESULT WINAPI PathCreateFromUrlW(LPCWSTR pszUrl, LPWSTR pszPath, return ret; } +/************************************************************************* + * PathCreateFromUrlAlloc [SHLWAPI.@] + */ +HRESULT WINAPI PathCreateFromUrlAlloc(LPCWSTR pszUrl, LPWSTR *pszPath, + DWORD dwReserved) +{ + WCHAR pathW[MAX_PATH]; + DWORD size; + HRESULT hr; + + size = MAX_PATH; + hr = PathCreateFromUrlW(pszUrl, pathW, &size, dwReserved); + if (SUCCEEDED(hr)) + { + /* Yes, this is supposed to crash if pszPath is NULL */ + *pszPath = StrDupW(pathW); + } + return hr; +} + /************************************************************************* * PathRelativePathToA [SHLWAPI.@] * diff --git a/dlls/shlwapi/shlwapi.spec b/dlls/shlwapi/shlwapi.spec index e0bdcf104a1..025d48afe62 100644 --- a/dlls/shlwapi/shlwapi.spec +++ b/dlls/shlwapi/shlwapi.spec @@ -586,6 +586,7 @@ @ stdcall PathCompactPathW(long wstr long) @ stdcall PathCreateFromUrlA(str ptr ptr long) @ stdcall PathCreateFromUrlW(wstr ptr ptr long) +@ stdcall PathCreateFromUrlAlloc(wstr ptr long) @ stdcall PathFileExistsA (str) @ stdcall PathFileExistsW (wstr) @ stdcall PathFindExtensionA (str) diff --git a/dlls/shlwapi/tests/path.c b/dlls/shlwapi/tests/path.c index 64179884e6a..d9209bddf3e 100644 --- a/dlls/shlwapi/tests/path.c +++ b/dlls/shlwapi/tests/path.c @@ -32,6 +32,7 @@ static HRESULT (WINAPI *pPathIsValidCharW)(WCHAR,DWORD); static LPWSTR (WINAPI *pPathCombineW)(LPWSTR, LPCWSTR, LPCWSTR); static HRESULT (WINAPI *pPathCreateFromUrlA)(LPCSTR, LPSTR, LPDWORD, DWORD); static HRESULT (WINAPI *pPathCreateFromUrlW)(LPCWSTR, LPWSTR, LPDWORD, DWORD); +static HRESULT (WINAPI *pPathCreateFromUrlAlloc)(LPCWSTR, LPWSTR*, DWORD); static BOOL (WINAPI *pPathAppendA)(LPSTR, LPCSTR); /* ################ */ @@ -326,6 +327,18 @@ static void test_PathCreateFromUrl(void) FreeWideString(pathW); } } + + if (pPathCreateFromUrlAlloc) + { + static const WCHAR fileW[] = {'f','i','l','e',':','/','/','f','o','o',0}; + static const WCHAR fooW[] = {'\\','\\','f','o','o',0}; + + pathW = NULL; + ret = pPathCreateFromUrlAlloc(fileW, &pathW, 0); + ok(ret == S_OK, "got 0x%08x expected S_OK\n", ret); + ok(lstrcmpiW(pathW, fooW) == 0, "got %s expected %s\n", wine_dbgstr_w(pathW), wine_dbgstr_w(fooW)); + HeapFree(GetProcessHeap(), 0, pathW); + } } @@ -1453,6 +1466,7 @@ START_TEST(path) pPathCreateFromUrlA = (void*)GetProcAddress(hShlwapi, "PathCreateFromUrlA"); pPathCreateFromUrlW = (void*)GetProcAddress(hShlwapi, "PathCreateFromUrlW"); + pPathCreateFromUrlAlloc = (void*)GetProcAddress(hShlwapi, "PathCreateFromUrlAlloc"); pPathCombineW = (void*)GetProcAddress(hShlwapi, "PathCombineW"); pPathIsValidCharA = (void*)GetProcAddress(hShlwapi, (LPSTR)455); pPathIsValidCharW = (void*)GetProcAddress(hShlwapi, (LPSTR)456); diff --git a/include/shlwapi.h b/include/shlwapi.h index cbfaabe71e4..067ef7b2138 100644 --- a/include/shlwapi.h +++ b/include/shlwapi.h @@ -372,16 +372,18 @@ int WINAPI PathCommonPrefixA(LPCSTR,LPCSTR,LPSTR); int WINAPI PathCommonPrefixW(LPCWSTR,LPCWSTR,LPWSTR); #define PathCommonPrefix WINELIB_NAME_AW(PathCommonPrefix) -HRESULT WINAPI PathCreateFromUrlA(LPCSTR pszUrl, LPSTR pszPath, LPDWORD pcchPath, DWORD dwReserved); -HRESULT WINAPI PathCreateFromUrlW(LPCWSTR pszUrl, LPWSTR pszPath, LPDWORD pcchPath, DWORD dwReserved); +HRESULT WINAPI PathCreateFromUrlA(LPCSTR,LPSTR,LPDWORD,DWORD); +HRESULT WINAPI PathCreateFromUrlW(LPCWSTR,LPWSTR,LPDWORD,DWORD); #define PathCreateFromUrl WINELIB_NAME_AW(PathCreateFromUrl) +HRESULT WINAPI PathCreateFromUrlAlloc(LPCWSTR,LPWSTR*,DWORD); + BOOL WINAPI PathFileExistsA(LPCSTR); BOOL WINAPI PathFileExistsW(LPCWSTR); #define PathFileExists WINELIB_NAME_AW(PathFileExists) -BOOL WINAPI PathFileExistsAndAttributesA(LPCSTR lpszPath, DWORD *dwAttr); -BOOL WINAPI PathFileExistsAndAttributesW(LPCWSTR lpszPath, DWORD *dwAttr); +BOOL WINAPI PathFileExistsAndAttributesA(LPCSTR,DWORD*); +BOOL WINAPI PathFileExistsAndAttributesW(LPCWSTR,DWORD*); #define PathFileExistsAndAttributes WINELIB_NAME_AW(PathFileExistsAndAttributes) LPSTR WINAPI PathFindExtensionA(LPCSTR);