From: Ziqing Hui zhui@codeweavers.com
--- dlls/propsys/propvar.c | 55 +++++++++++++++++++++++++++++++++++- dlls/propsys/tests/propsys.c | 8 ------ 2 files changed, 54 insertions(+), 9 deletions(-)
diff --git a/dlls/propsys/propvar.c b/dlls/propsys/propvar.c index c54fe868ee3..d70037a7ec5 100644 --- a/dlls/propsys/propvar.c +++ b/dlls/propsys/propvar.c @@ -1056,7 +1056,60 @@ 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; + 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 ae46011e983..5d8f549a44d 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, 'X', "%c"); check_PropVariantToVariant(propvar, var, I2, iVal, -456, "%d"); check_PropVariantToVariant(propvar, var, I4, lVal, -789, "%ld"); @@ -2483,7 +2476,6 @@ 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");