diff --git a/dlls/shlwapi/shlwapi.spec b/dlls/shlwapi/shlwapi.spec index 0dc82cca2c6..8832bf38556 100644 --- a/dlls/shlwapi/shlwapi.spec +++ b/dlls/shlwapi/shlwapi.spec @@ -686,8 +686,8 @@ init SHLWAPI_LibMain # exported in later versions @ stdcall StrRetToBufA (ptr ptr ptr long) StrRetToBufA @ stdcall StrRetToBufW (ptr ptr ptr long) StrRetToBufW -#@ stdcall StrRetToStrA (ptr ptr ptr) StrRetToStrA -#@ stdcall StrRetToStrW (ptr ptr ptr) StrRetToStrW +@ stdcall StrRetToStrA (ptr ptr ptr) StrRetToStrA +@ stdcall StrRetToStrW (ptr ptr ptr) StrRetToStrW @ stdcall SHRegGetPathA(long str str ptr long)SHRegGetPathA @ stdcall SHRegGetPathW(long wstr wstr ptr long)SHRegGetPathW @ stub MLLoadLibraryA diff --git a/dlls/shlwapi/string.c b/dlls/shlwapi/string.c index 1e1261da3bc..415eaaa7df5 100644 --- a/dlls/shlwapi/string.c +++ b/dlls/shlwapi/string.c @@ -37,6 +37,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell); +HRESULT WINAPI _SHStrDupAA(LPCSTR src, LPSTR * dest); +HRESULT WINAPI _SHStrDupAW(LPCWSTR src, LPSTR * dest); + /************************************************************************* * ChrCmpIA [SHLWAPI.385] * @@ -558,6 +561,64 @@ HRESULT WINAPI StrRetToBufW (LPSTRRET src, const ITEMIDLIST *pidl, LPWSTR dest, return S_OK; } +/************************************************************************* + * StrRetToStrA [SHLWAPI.@] + * + * converts a STRRET to a normal string + */ +HRESULT WINAPI StrRetToStrA(LPSTRRET pstr, const ITEMIDLIST * pidl, LPSTR* ppszName) +{ + HRESULT ret = E_FAIL; + + switch (pstr->uType) { + case STRRET_WSTR: + ret = _SHStrDupAW(pstr->u.pOleStr, ppszName); + CoTaskMemFree(pstr->u.pOleStr); + break; + + case STRRET_CSTR: + ret = _SHStrDupAA(pstr->u.cStr, ppszName); + break; + + case STRRET_OFFSET: + ret = _SHStrDupAA(((LPCSTR)&pidl->mkid)+pstr->u.uOffset, ppszName); + break; + + default: + *ppszName = NULL; + } + return ret; +} + +/************************************************************************* + * StrRetToStrW [SHLWAPI.@] + * + * converts a STRRET to a normal string + */ +HRESULT WINAPI StrRetToStrW(LPSTRRET pstr, const ITEMIDLIST * pidl, LPWSTR* ppszName) +{ + HRESULT ret = E_FAIL; + + switch (pstr->uType) { + case STRRET_WSTR: + ret = SHStrDupW(pstr->u.pOleStr, ppszName); + CoTaskMemFree(pstr->u.pOleStr); + break; + + case STRRET_CSTR: + ret = SHStrDupA(pstr->u.cStr, ppszName); + break; + + case STRRET_OFFSET: + ret = SHStrDupA(((LPCSTR)&pidl->mkid)+pstr->u.uOffset, ppszName); + break; + + default: + *ppszName = NULL; + } + return ret; +} + /************************************************************************* * StrFormatByteSizeA [SHLWAPI.@] */ @@ -635,6 +696,34 @@ BOOL WINAPI StrTrimA(LPSTR pszSource, LPCSTR pszTrimChars) return trimmed; } +/************************************************************************* + * _SHStrDupA [INTERNAL] + * + * Duplicates a ASCII string to ASCII. The destination buffer is allocated. + */ +HRESULT WINAPI _SHStrDupAA(LPCSTR src, LPSTR * dest) +{ + HRESULT hr; + int len = 0; + + if (src) { + len = lstrlenA(src); + *dest = CoTaskMemAlloc(len); + } else { + *dest = NULL; + } + + if (*dest) { + lstrcpynA(*dest,src, len); + hr = S_OK; + } else { + hr = E_OUTOFMEMORY; + } + + TRACE("%s->(%p)\n", debugstr_a(src), *dest); + return hr; +} + /************************************************************************* * SHStrDupA [SHLWAPI.@] * @@ -663,6 +752,34 @@ HRESULT WINAPI SHStrDupA(LPCSTR src, LPWSTR * dest) return hr; } +/************************************************************************* + * _SHStrDupAW [INTERNAL] + * + * Duplicates a UNICODE to a ASCII string. The destination buffer is allocated. + */ +HRESULT WINAPI _SHStrDupAW(LPCWSTR src, LPSTR * dest) +{ + HRESULT hr; + int len = 0; + + if (src) { + len = WideCharToMultiByte(CP_ACP, 0, src, -1, NULL, 0, NULL, NULL); + *dest = CoTaskMemAlloc(len); + } else { + *dest = NULL; + } + + if (*dest) { + WideCharToMultiByte(CP_ACP, 0, src, -1, *dest, len, NULL, NULL); + hr = S_OK; + } else { + hr = E_OUTOFMEMORY; + } + + TRACE("%s->(%p)\n", debugstr_w(src), *dest); + return hr; +} + /************************************************************************* * SHStrDupW [SHLWAPI.@] *