Module: wine Branch: master Commit: ff2f4941951b99acdb46fa67d64c8069431171c0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ff2f4941951b99acdb46fa67d6...
Author: Detlef Riekenberg wine.dev@web.de Date: Tue Dec 4 11:38:00 2012 +0100
shell32: Implement DoEnvironmentSubstW.
---
dlls/shell32/shellord.c | 41 +++++++++++++++++++++++++++++++++++++---- 1 files changed, 37 insertions(+), 4 deletions(-)
diff --git a/dlls/shell32/shellord.c b/dlls/shell32/shellord.c index c1fb382..b71d213 100644 --- a/dlls/shell32/shellord.c +++ b/dlls/shell32/shellord.c @@ -1626,14 +1626,47 @@ DWORD WINAPI DoEnvironmentSubstA(LPSTR pszString, UINT cchString) }
/************************************************************************ - * DoEnvironmentSubstW [SHELL32.@] + * DoEnvironmentSubstW [SHELL32.@] * - * See DoEnvironmentSubstA. + * Replace all %KEYWORD% in the string with the value of the named + * environment variable. If the buffer is too small, the string is not modified. + * + * PARAMS + * pszString [I] '\0' terminated string with %keyword%. + * [O] '\0' terminated string with %keyword% substituted. + * cchString [I] size of str. + * + * RETURNS + * Success: The string in the buffer is updated + * HIWORD: TRUE + * LOWORD: characters used in the buffer, including space for the terminating 0 + * Failure: buffer too small. The string is not modified. + * HIWORD: FALSE + * LOWORD: provided size of the buffer in characters */ DWORD WINAPI DoEnvironmentSubstW(LPWSTR pszString, UINT cchString) { - FIXME("(%s, %d): stub\n", debugstr_w(pszString), cchString); - return MAKELONG(FALSE,cchString); + LPWSTR dst; + BOOL res = FALSE; + DWORD len = cchString; + + TRACE("(%s, %d)\n", debugstr_w(pszString), cchString); + + if ((cchString < MAXLONG) && (dst = HeapAlloc(GetProcessHeap(), 0, cchString * sizeof(WCHAR)))) + { + len = ExpandEnvironmentStringsW(pszString, dst, cchString); + /* len includes the terminating 0 */ + if (len && len <= cchString) + { + res = TRUE; + memcpy(pszString, dst, len * sizeof(WCHAR)); + } + else + len = cchString; + + HeapFree(GetProcessHeap(), 0, dst); + } + return MAKELONG(len, res); }
/************************************************************************