Module: wine Branch: master Commit: eec6aea10a9210737f884ca31b1bcc6d96572b5a URL: https://gitlab.winehq.org/wine/wine/-/commit/eec6aea10a9210737f884ca31b1bcc6...
Author: Paul Gofman pgofman@codeweavers.com Date: Wed Nov 23 12:52:48 2022 -0600
wmic: Support array of BSTRs in convert_to_bstr().
---
programs/wmic/main.c | 43 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-)
diff --git a/programs/wmic/main.c b/programs/wmic/main.c index e0ba498e5f6..e49300c9cbc 100644 --- a/programs/wmic/main.c +++ b/programs/wmic/main.c @@ -168,14 +168,53 @@ static HRESULT process_property_list( IWbemClassObject *obj, const WCHAR *propli
static void convert_to_bstr( VARIANT *v ) { + BSTR out = NULL; VARTYPE vt;
if (SUCCEEDED(VariantChangeType( v, v, 0, VT_BSTR ))) return; vt = V_VT(v); + if (vt == (VT_ARRAY | VT_BSTR)) + { + unsigned int i, count, len; + BSTR *strings; + WCHAR *ptr; + + if (FAILED(SafeArrayAccessData( V_ARRAY(v), (void **)&strings ))) + { + WINE_ERR( "Could not access array.\n" ); + goto done; + } + count = V_ARRAY(v)->rgsabound->cElements; + len = 0; + for (i = 0; i < count; ++i) + len += wcslen( strings[i] ); + len += count * 2 + 2; + if (count) len += 2 * (count - 1); + out = SysAllocStringLen( NULL, len ); + ptr = out; + *ptr++ = '{'; + for (i = 0; i < count; ++i) + { + if (i) + { + memcpy( ptr, L", ", 2 * sizeof(*ptr) ); + ptr += 2; + } + *ptr++ = '"'; + len = wcslen( strings[i] ); + memcpy( ptr, strings[i], len * sizeof(*ptr) ); + ptr += len; + *ptr++ = '"'; + } + *ptr++ = '}'; + *ptr = 0; + SafeArrayUnaccessData( V_ARRAY(v) ); + } +done: VariantClear( v ); V_VT(v) = VT_BSTR; - V_BSTR(v) = SysAllocString( L"" ); - if (vt != VT_NULL && vt != VT_EMPTY) + V_BSTR(v) = out ? out : SysAllocString( L"" ); + if (vt != VT_NULL && vt != VT_EMPTY && !out) WINE_FIXME( "Could not convert variant, vt %u.\n", vt ); }