From: Ziqing Hui zhui@codeweavers.com
--- dlls/propsys/propvar.c | 62 +++++++++++++++++++++++++++++++++++- dlls/propsys/tests/propsys.c | 20 ------------ 2 files changed, 61 insertions(+), 21 deletions(-)
diff --git a/dlls/propsys/propvar.c b/dlls/propsys/propvar.c index c54fe868ee3..2d99406b070 100644 --- a/dlls/propsys/propvar.c +++ b/dlls/propsys/propvar.c @@ -1056,7 +1056,67 @@ INT WINAPI PropVariantCompareEx(REFPROPVARIANT propvar1, REFPROPVARIANT propvar2
HRESULT WINAPI PropVariantToVariant(const PROPVARIANT *propvar, VARIANT *var) { - return E_NOTIMPL; + HRESULT hr = S_OK; + + TRACE("propvar %p, var %p, propvar->vt %#x.\n", var, propvar, propvar->vt); + + if (!var || !propvar) + return E_INVALIDARG; + + VariantInit(var); + var->vt = propvar->vt; + + switch (propvar->vt) + { + case VT_EMPTY: + case VT_NULL: + break; + case VT_I1: + V_I1(var) = propvar->cVal; + break; + case VT_I2: + V_I2(var) = propvar->iVal; + break; + case VT_I4: + V_I4(var) = propvar->lVal; + break; + case VT_I8: + V_I8(var) = propvar->hVal.QuadPart; + break; + case VT_UI1: + V_UI1(var) = propvar->bVal; + break; + case VT_UI2: + V_UI2(var) = propvar->uiVal; + break; + case VT_UI4: + V_UI4(var) = propvar->ulVal; + break; + case VT_UI8: + V_UI8(var) = propvar->uhVal.QuadPart; + break; + case VT_BOOL: + V_BOOL(var) = propvar->boolVal; + break; + case VT_R4: + V_R4(var) = propvar->fltVal; + break; + case VT_R8: + V_R8(var) = propvar->dblVal; + break; + case VT_BSTR: + case VT_LPSTR: + case VT_LPWSTR: + case VT_CLSID: + V_VT(var) = VT_BSTR; + hr = PropVariantToStringAlloc(propvar, &V_BSTR(var)); + break; + default: + FIXME("Unsupported type %d.\n", propvar->vt); + return E_INVALIDARG; + } + + return hr; }
HRESULT WINAPI VariantToPropVariant(const VARIANT *var, PROPVARIANT *propvar) diff --git a/dlls/propsys/tests/propsys.c b/dlls/propsys/tests/propsys.c index a02cfc20cae..eaebcf18420 100644 --- a/dlls/propsys/tests/propsys.c +++ b/dlls/propsys/tests/propsys.c @@ -2439,10 +2439,8 @@ static void test_PropVariantToVariant(void) PropVariantInit(&propvar);
hr = PropVariantToVariant(NULL, &var); - todo_wine ok(hr == E_INVALIDARG, "PropVariantToVariant returned %#lx.\n", hr); hr = PropVariantToVariant(&propvar, NULL); - todo_wine ok(hr == E_INVALIDARG, "PropVariantToVariant returned %#lx.\n", hr);
propvar.vt = 0xdead; @@ -2456,19 +2454,14 @@ static void test_PropVariantToVariant(void)
propvar.vt = VT_EMPTY; hr = PropVariantToVariant(&propvar, &var); - todo_wine ok(hr == S_OK, "PropVariantToVariant returned %#lx.\n", hr); ok(V_VT(&var) == VT_EMPTY, "Unexpected V_VT(&var) %d.\n", V_VT(&var));
propvar.vt = VT_NULL; hr = PropVariantToVariant(&propvar, &var); - todo_wine ok(hr == S_OK, "PropVariantToVariant returned %#lx.\n", hr); - todo_wine ok(V_VT(&var) == VT_NULL, "Unexpected V_VT(&var) %d.\n", V_VT(&var));
- todo_wine - { check_PropVariantToVariant(propvar, var, I1, cVal, -123, "%c"); check_PropVariantToVariant(propvar, var, I2, iVal, -456, "%d"); check_PropVariantToVariant(propvar, var, I4, lVal, -789, "%ld"); @@ -2483,19 +2476,14 @@ static void test_PropVariantToVariant(void)
check_PropVariantToVariant(propvar, var, R4, fltVal, 0.123f, "%f"); check_PropVariantToVariant(propvar, var, R8, dblVal, 0.456f, "%f"); - }
propvar.vt = VT_BSTR; propvar.bstrVal = SysAllocString(L"test"); hr = PropVariantToVariant(&propvar, &var); - todo_wine ok(hr == S_OK, "PropVariantToVariant returned %#lx.\n", hr); - if (hr == S_OK) - { ok(V_VT(&var) == VT_BSTR, "Unexpected V_VT(&var) %d.\n", V_VT(&var)); ok(V_BSTR(&var) != propvar.bstrVal, "Got same string pointer.\n"); ok(!wcscmp(V_BSTR(&var), propvar.bstrVal), "Unexpected V_BSTR(&var) %s.\n", debugstr_w(V_BSTR(&var))); - } PropVariantClear(&propvar); VariantClear(&var);
@@ -2515,27 +2503,19 @@ static void test_PropVariantToVariant(void) propvar.vt = VT_LPSTR; propvar.pszVal = (char *)topic; hr = PropVariantToVariant(&propvar, &var); - todo_wine ok(hr == S_OK, "PropVariantToVariant returned %#lx.\n", hr); - if (hr == S_OK) - { ok(V_VT(&var) == VT_BSTR, "Unexpected V_VT(&var) %d.\n", V_VT(&var)); ok(!wcscmp(V_BSTR(&var), topicW), "Unexpected V_BSTR(&var) %s.\n", debugstr_w(V_BSTR(&var))); - } PropVariantClear(&propvar); VariantClear(&var);
propvar.vt = VT_LPWSTR; propvar.pwszVal = (WCHAR *)topicW; hr = PropVariantToVariant(&propvar, &var); - todo_wine ok(hr == S_OK, "PropVariantToVariant returned %#lx.\n", hr); - if (hr == S_OK) - { ok(V_VT(&var) == VT_BSTR, "Unexpected V_VT(&var) %d.\n", V_VT(&var)); ok(V_BSTR(&var) != topicW, "Got same string pointer.\n"); ok(!wcscmp(V_BSTR(&var), topicW), "Unexpected V_BSTR(&var) %s.\n", debugstr_w(V_BSTR(&var))); - } PropVariantClear(&propvar); VariantClear(&var); }