We don't need copies of this function in three places.
-- v2: comdlg32: Use StrRetToBuf instead of reimplementing it. shell32: Use StrRetToBuf instead of reimplementing it.
From: Alex Henrie alexhenrie24@gmail.com
--- dlls/shell32/tests/string.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/dlls/shell32/tests/string.c b/dlls/shell32/tests/string.c index d40f6c7fc4f..a1202ead945 100644 --- a/dlls/shell32/tests/string.c +++ b/dlls/shell32/tests/string.c @@ -60,7 +60,7 @@ static void test_StrRetToStringNW(void) strret.uType = STRRET_WSTR; strret.pOleStr = CoDupStrW("Test"); memset(buff, 0xff, sizeof(buff)); - ret = pStrRetToStrNAW(buff, ARRAY_SIZE(buff), &strret, NULL); + ret = pStrRetToStrNAW(buff, ARRAY_SIZE(buff) - 1, &strret, NULL); ok(ret == TRUE && !wcscmp(buff, szTestW), "STRRET_WSTR: dup failed, ret=%d\n", ret);
@@ -79,6 +79,20 @@ static void test_StrRetToStringNW(void) ok(ret == TRUE && !wcscmp(buff, szTestW), "STRRET_OFFSET: dup failed, ret=%d\n", ret);
+ strret.uType = 3; + memset(buff, 0xff, sizeof(buff)); + ret = pStrRetToStrNAW(buff, 0, &strret, NULL); + todo_wine + ok(ret == TRUE && buff[0] == 0xffff, + "Invalid STRRET type: dup failed, ret=%d\n", ret); + + strret.uType = 3; + memset(buff, 0xff, sizeof(buff)); + ret = pStrRetToStrNAW(buff, ARRAY_SIZE(buff), &strret, NULL); + todo_wine + ok(ret == TRUE && buff[0] == 0, + "Invalid STRRET type: dup failed, ret=%d\n", ret); + /* The next test crashes on W2K, WinXP and W2K3, so we don't test. */ if (0) {
From: Alex Henrie alexhenrie24@gmail.com
--- dlls/shlwapi/string.c | 8 ++++---- dlls/shlwapi/tests/string.c | 6 ++++++ 2 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/dlls/shlwapi/string.c b/dlls/shlwapi/string.c index 37d4d526fb6..4bf95f98170 100644 --- a/dlls/shlwapi/string.c +++ b/dlls/shlwapi/string.c @@ -231,8 +231,8 @@ HRESULT WINAPI StrRetToBufA (LPSTRRET src, const ITEMIDLIST *pidl, LPSTR dest, U break;
default: - FIXME("unknown type!\n"); - return E_NOTIMPL; + WARN("unknown type!\n"); + return E_FAIL; } return S_OK; } @@ -290,8 +290,8 @@ HRESULT WINAPI StrRetToBufW (LPSTRRET src, const ITEMIDLIST *pidl, LPWSTR dest, break;
default: - FIXME("unknown type!\n"); - return E_NOTIMPL; + WARN("unknown type!\n"); + return E_FAIL; }
return S_OK; diff --git a/dlls/shlwapi/tests/string.c b/dlls/shlwapi/tests/string.c index 19430f27296..8fa0b0534cb 100644 --- a/dlls/shlwapi/tests/string.c +++ b/dlls/shlwapi/tests/string.c @@ -1150,6 +1150,12 @@ if (0) hres = pStrRetToBufW(&strret, NULL, wbuf, 10); ok(hres == E_FAIL, "StrRetToBufW returned %08lx\n", hres); ok(!wbuf[0], "StrRetToBuf returned %s\n", wine_dbgstr_w(wbuf)); + + memset(wbuf, 0xbf, sizeof(wbuf)); + strret.uType = 3; + hres = pStrRetToBufW(&strret, NULL, wbuf, 10); + ok(hres == E_FAIL, "StrRetToBufW returned %08lx\n", hres); + ok(!wbuf[0], "StrRetToBuf returned %s\n", wine_dbgstr_w(wbuf)); } else win_skip("StrRetToBufW() is not available\n");
From: Alex Henrie alexhenrie24@gmail.com
--- dlls/shell32/brsfolder.c | 2 +- dlls/shell32/pidl.c | 10 +---- dlls/shell32/shell32_main.c | 2 +- dlls/shell32/shell32_main.h | 4 +- dlls/shell32/shellstring.c | 88 +++---------------------------------- dlls/shell32/shlexec.c | 2 +- dlls/shell32/shlfolder.c | 6 +-- dlls/shell32/shlview.c | 6 +-- dlls/shell32/tests/string.c | 2 - 9 files changed, 17 insertions(+), 105 deletions(-)
diff --git a/dlls/shell32/brsfolder.c b/dlls/shell32/brsfolder.c index 63f0a3420dd..ebaf01e7989 100644 --- a/dlls/shell32/brsfolder.c +++ b/dlls/shell32/brsfolder.c @@ -327,7 +327,7 @@ static BOOL GetName(LPSHELLFOLDER lpsf, LPCITEMIDLIST lpi, DWORD dwFlags, LPWSTR
TRACE("%p %p %lx %p\n", lpsf, lpi, dwFlags, lpFriendlyName); if (SUCCEEDED(IShellFolder_GetDisplayNameOf(lpsf, lpi, dwFlags, &str))) - bSuccess = StrRetToStrNW(lpFriendlyName, MAX_PATH, &str, lpi); + bSuccess = SUCCEEDED(StrRetToBufW(&str, lpi, lpFriendlyName, MAX_PATH)); else bSuccess = FALSE;
diff --git a/dlls/shell32/pidl.c b/dlls/shell32/pidl.c index 668a5bc583a..4cf052e3bda 100644 --- a/dlls/shell32/pidl.c +++ b/dlls/shell32/pidl.c @@ -126,10 +126,7 @@ BOOL ILGetDisplayNameExW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPWSTR path, DWO { ret = IShellFolder_GetDisplayNameOf(lsf, pidl, flag, &strret); if (SUCCEEDED(ret)) - { - if(!StrRetToStrNW(path, MAX_PATH, &strret, pidl)) - ret = E_FAIL; - } + ret = StrRetToBufW(&strret, pidl, path, MAX_PATH); } else { @@ -138,10 +135,7 @@ BOOL ILGetDisplayNameExW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPWSTR path, DWO { ret = IShellFolder_GetDisplayNameOf(psfParent, pidllast, flag, &strret); if (SUCCEEDED(ret)) - { - if(!StrRetToStrNW(path, MAX_PATH, &strret, pidllast)) - ret = E_FAIL; - } + ret = StrRetToBufW(&strret, pidllast, path, MAX_PATH); IShellFolder_Release(psfParent); } } diff --git a/dlls/shell32/shell32_main.c b/dlls/shell32/shell32_main.c index c739e1723f7..7ff64e4df46 100644 --- a/dlls/shell32/shell32_main.c +++ b/dlls/shell32/shell32_main.c @@ -265,7 +265,7 @@ DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path,DWORD dwFileAttributes, STRRET str; hr = IShellFolder_GetDisplayNameOf( psfParent, pidlLast, SHGDN_INFOLDER, &str); - StrRetToStrNW (psfi->szDisplayName, MAX_PATH, &str, pidlLast); + StrRetToBufW(&str, pidlLast, psfi->szDisplayName, MAX_PATH); } }
diff --git a/dlls/shell32/shell32_main.h b/dlls/shell32/shell32_main.h index 6b5575c6879..766c7c23adc 100644 --- a/dlls/shell32/shell32_main.h +++ b/dlls/shell32/shell32_main.h @@ -34,6 +34,7 @@ #include "docobj.h" #include "shlobj.h" #include "shellapi.h" +#include "shlwapi.h" #include "wine/heap.h" #include "wine/list.h"
@@ -270,9 +271,6 @@ typedef struct ITEMIDLIST idl; } CWTESTPATHSTRUCT;
-BOOL WINAPI StrRetToStrNA(char *, DWORD, STRRET *, const ITEMIDLIST *); -BOOL WINAPI StrRetToStrNW(WCHAR *, DWORD, STRRET *, const ITEMIDLIST *); - WCHAR *shell_get_resource_string(UINT id);
#endif diff --git a/dlls/shell32/shellstring.c b/dlls/shell32/shellstring.c index 13108dbc8b7..53840589362 100644 --- a/dlls/shell32/shellstring.c +++ b/dlls/shell32/shellstring.c @@ -38,86 +38,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell);
DWORD WINAPI CheckEscapesW(WCHAR *string, DWORD len);
-/************************* STRRET functions ****************************/ - -static const char *debugstr_strret(STRRET *s) -{ - switch (s->uType) - { - case STRRET_WSTR: - return "STRRET_WSTR"; - case STRRET_CSTR: - return "STRRET_CSTR"; - case STRRET_OFFSET: - return "STRRET_OFFSET"; - default: - return "STRRET_???"; - } -} - -BOOL WINAPI StrRetToStrNA(LPSTR dest, DWORD len, LPSTRRET src, const ITEMIDLIST *pidl) -{ - TRACE("dest=%p len=0x%lx strret=%p(%s) pidl=%p\n", dest, len, src, debugstr_strret(src), pidl); - - if (!dest) - return FALSE; - - switch (src->uType) - { - case STRRET_WSTR: - WideCharToMultiByte(CP_ACP, 0, src->pOleStr, -1, dest, len, NULL, NULL); - CoTaskMemFree(src->pOleStr); - break; - case STRRET_CSTR: - lstrcpynA(dest, src->cStr, len); - break; - case STRRET_OFFSET: - lstrcpynA(dest, ((LPCSTR)&pidl->mkid)+src->uOffset, len); - break; - default: - FIXME("unknown type %u!\n", src->uType); - if (len) - *dest = '\0'; - return FALSE; - } - TRACE("-- %s\n", debugstr_a(dest) ); - return TRUE; -} - -/************************************************************************/ - -BOOL WINAPI StrRetToStrNW(LPWSTR dest, DWORD len, LPSTRRET src, const ITEMIDLIST *pidl) -{ - TRACE("dest=%p len=0x%lx strret=%p(%s) pidl=%p\n", dest, len, src, debugstr_strret(src), pidl); - - if (!dest) - return FALSE; - - switch (src->uType) - { - case STRRET_WSTR: - lstrcpynW(dest, src->pOleStr, len); - CoTaskMemFree(src->pOleStr); - break; - case STRRET_CSTR: - if (!MultiByteToWideChar(CP_ACP, 0, src->cStr, -1, dest, len) && len) - dest[len-1] = 0; - break; - case STRRET_OFFSET: - if (!MultiByteToWideChar(CP_ACP, 0, ((LPCSTR)&pidl->mkid)+src->uOffset, -1, dest, len) - && len) - dest[len-1] = 0; - break; - default: - FIXME("unknown type %u!\n", src->uType); - if (len) - *dest = '\0'; - return FALSE; - } - return TRUE; -} - - /************************************************************************* * StrRetToStrN [SHELL32.96] * @@ -128,10 +48,14 @@ BOOL WINAPI StrRetToStrNW(LPWSTR dest, DWORD len, LPSTRRET src, const ITEMIDLIST */ BOOL WINAPI StrRetToStrNAW(LPVOID dest, DWORD len, LPSTRRET src, const ITEMIDLIST *pidl) { + HRESULT res; + if(SHELL_OsIsUnicode()) - return StrRetToStrNW(dest, len, src, pidl); + res = StrRetToBufW(src, pidl, dest, len); else - return StrRetToStrNA(dest, len, src, pidl); + res = StrRetToBufA(src, pidl, dest, len); + + return res == S_OK || res == E_NOT_SUFFICIENT_BUFFER || src->uType > STRRET_CSTR; }
/************************* OLESTR functions ****************************/ diff --git a/dlls/shell32/shlexec.c b/dlls/shell32/shlexec.c index 631601ad21a..e685ea78af5 100644 --- a/dlls/shell32/shlexec.c +++ b/dlls/shell32/shlexec.c @@ -287,7 +287,7 @@ static HRESULT SHELL_GetPathFromIDListForExecuteW(LPCITEMIDLIST pidl, LPWSTR psz hr = IShellFolder_GetDisplayNameOf(desktop, pidl, SHGDN_FORPARSING, &strret);
if (SUCCEEDED(hr)) - StrRetToStrNW(pszPath, uOutSize, &strret, pidl); + StrRetToBufW(&strret, pidl, pszPath, uOutSize);
IShellFolder_Release(desktop); } diff --git a/dlls/shell32/shlfolder.c b/dlls/shell32/shlfolder.c index 1ff45e7139c..31016a3dbe6 100644 --- a/dlls/shell32/shlfolder.c +++ b/dlls/shell32/shlfolder.c @@ -344,10 +344,8 @@ HRESULT SHELL32_GetDisplayNameOfChild (IShellFolder2 * psf, LPITEMIDLIST pidlNext = ILGetNext (pidl);
hr = IShellFolder2_GetDisplayNameOf (psfChild, pidlNext, dwFlags, &strTemp); - if (SUCCEEDED (hr)) { - if(!StrRetToStrNW (szOut, dwOutLen, &strTemp, pidlNext)) - hr = E_FAIL; - } + if (SUCCEEDED (hr)) + hr = StrRetToBufW (&strTemp, pidlNext, szOut, dwOutLen); IShellFolder2_Release (psfChild); } ILFree (pidlFirst); diff --git a/dlls/shell32/shlview.c b/dlls/shell32/shlview.c index 9c699ecda08..a39d51dae2a 100644 --- a/dlls/shell32/shlview.c +++ b/dlls/shell32/shlview.c @@ -458,7 +458,7 @@ static void ShellView_InitList(IShellViewImpl *This)
lvColumn.fmt = sd.fmt; lvColumn.cx = MulDiv(sd.cxChar, tm.tmAveCharWidth * 3, 2); /* chars->pixel */ - StrRetToStrNW(nameW, ARRAY_SIZE(nameW), &sd.str, NULL); + StrRetToBufW(&sd.str, NULL, nameW, ARRAY_SIZE(nameW)); SendMessageW(This->hWndList, LVM_INSERTCOLUMNW, This->columns, (LPARAM)&lvColumn); }
@@ -1424,14 +1424,14 @@ static LRESULT ShellView_OnNotify(IShellViewImpl * This, UINT CtlID, LPNMHDR lpn
if (lpnmh->code == LVN_GETDISPINFOW) { - StrRetToStrNW( lpdi->item.pszText, lpdi->item.cchTextMax, &sd.str, NULL); + StrRetToBufW(&sd.str, NULL, lpdi->item.pszText, lpdi->item.cchTextMax); TRACE("-- text=%s\n", debugstr_w(lpdi->item.pszText)); } else { /* LVN_GETDISPINFOA - shouldn't happen */ NMLVDISPINFOA *lpdiA = (NMLVDISPINFOA *)lpnmh; - StrRetToStrNA( lpdiA->item.pszText, lpdiA->item.cchTextMax, &sd.str, NULL); + StrRetToBufA(&sd.str, NULL, lpdiA->item.pszText, lpdiA->item.cchTextMax); TRACE("-- text=%s\n", lpdiA->item.pszText); } } diff --git a/dlls/shell32/tests/string.c b/dlls/shell32/tests/string.c index a1202ead945..f06df25e384 100644 --- a/dlls/shell32/tests/string.c +++ b/dlls/shell32/tests/string.c @@ -82,14 +82,12 @@ static void test_StrRetToStringNW(void) strret.uType = 3; memset(buff, 0xff, sizeof(buff)); ret = pStrRetToStrNAW(buff, 0, &strret, NULL); - todo_wine ok(ret == TRUE && buff[0] == 0xffff, "Invalid STRRET type: dup failed, ret=%d\n", ret);
strret.uType = 3; memset(buff, 0xff, sizeof(buff)); ret = pStrRetToStrNAW(buff, ARRAY_SIZE(buff), &strret, NULL); - todo_wine ok(ret == TRUE && buff[0] == 0, "Invalid STRRET type: dup failed, ret=%d\n", ret);
From: Alex Henrie alexhenrie24@gmail.com
--- dlls/comdlg32/filedlg.c | 34 +----------------------------- dlls/comdlg32/filedlgbrowser.c | 38 +--------------------------------- 2 files changed, 2 insertions(+), 70 deletions(-)
diff --git a/dlls/comdlg32/filedlg.c b/dlls/comdlg32/filedlg.c index 441f203fe7b..43066f02d83 100644 --- a/dlls/comdlg32/filedlg.c +++ b/dlls/comdlg32/filedlg.c @@ -3834,38 +3834,6 @@ ret: COMCTL32_ReleaseStgMedium(medium); }
- -/* copied from shell32 to avoid linking to it - * Although shell32 is already linked the behaviour of exported StrRetToStrN - * is dependent on whether emulated OS is unicode or not. - */ -static HRESULT COMDLG32_StrRetToStrNW (LPWSTR dest, DWORD len, LPSTRRET src, const ITEMIDLIST *pidl) -{ - switch (src->uType) - { - case STRRET_WSTR: - lstrcpynW(dest, src->pOleStr, len); - CoTaskMemFree(src->pOleStr); - break; - - case STRRET_CSTR: - if (!MultiByteToWideChar( CP_ACP, 0, src->cStr, -1, dest, len ) && len) - dest[len-1] = 0; - break; - - case STRRET_OFFSET: - if (!MultiByteToWideChar( CP_ACP, 0, ((LPCSTR)&pidl->mkid)+src->uOffset, -1, dest, len ) && len) - dest[len-1] = 0; - break; - - default: - FIXME("unknown type %x!\n", src->uType); - if (len) *dest = '\0'; - return E_FAIL; - } - return S_OK; -} - /*********************************************************************** * FILEDLG95_FILENAME_GetFileNames * @@ -4005,7 +3973,7 @@ static HRESULT GetName(LPSHELLFOLDER lpsf, LPITEMIDLIST pidl,DWORD dwFlags,LPWST /* Get the display name of the pidl relative to the folder */ if (SUCCEEDED(hRes = IShellFolder_GetDisplayNameOf(lpsf, pidl, dwFlags, &str))) { - return COMDLG32_StrRetToStrNW(lpstrFileName, MAX_PATH, &str, pidl); + return StrRetToBufW(&str, pidl, lpstrFileName, MAX_PATH); } return E_FAIL; } diff --git a/dlls/comdlg32/filedlgbrowser.c b/dlls/comdlg32/filedlgbrowser.c index 14a9da91dc7..9c51e0d6056 100644 --- a/dlls/comdlg32/filedlgbrowser.c +++ b/dlls/comdlg32/filedlgbrowser.c @@ -145,42 +145,6 @@ static void COMDLG32_UpdateCurrentDir(const FileOpenDlgInfos *fodInfos) IShellFolder_Release(psfDesktop); }
-/* copied from shell32 to avoid linking to it */ -static BOOL COMDLG32_StrRetToStrNW (LPVOID dest, DWORD len, LPSTRRET src, LPCITEMIDLIST pidl) -{ - TRACE("dest=%p len=0x%lx strret=%p pidl=%p\n", dest , len, src, pidl); - - switch (src->uType) - { - case STRRET_WSTR: - lstrcpynW(dest, src->pOleStr, len); - CoTaskMemFree(src->pOleStr); - break; - - case STRRET_CSTR: - if (len && !MultiByteToWideChar( CP_ACP, 0, src->cStr, -1, dest, len )) - ((LPWSTR)dest)[len-1] = 0; - break; - - case STRRET_OFFSET: - if (pidl) - { - if (len && !MultiByteToWideChar( CP_ACP, 0, ((LPCSTR)&pidl->mkid)+src->uOffset, - -1, dest, len )) - ((LPWSTR)dest)[len-1] = 0; - } - break; - - default: - FIXME("unknown type!\n"); - if (len) - { *(LPWSTR)dest = '\0'; - } - return(FALSE); - } - return TRUE; -} - /* * IShellBrowser */ @@ -945,7 +909,7 @@ static HRESULT WINAPI IShellBrowserImpl_ICommDlgBrowser_IncludeObject(ICommDlgBr
if (SUCCEEDED(IShellFolder_GetDisplayNameOf(fodInfos->Shell.FOIShellFolder, pidl, SHGDN_INFOLDER | SHGDN_FORPARSING, &str))) { - if (COMDLG32_StrRetToStrNW(szPathW, MAX_PATH, &str, pidl)) + if (SUCCEEDED(StrRetToBufW(&str, pidl, szPathW, MAX_PATH))) { if (PathMatchSpecW(szPathW, fodInfos->ShellInfos.lpstrCurrentFilter)) return S_OK;