diff --git a/dlls/propsys/propstore.c b/dlls/propsys/propstore.c index 00ff70162d9..7c2813186c8 100644 --- a/dlls/propsys/propstore.c +++ b/dlls/propsys/propstore.c @@ -351,8 +351,31 @@ static HRESULT WINAPI PropertyStore_GetState(IPropertyStoreCache *iface, static HRESULT WINAPI PropertyStore_GetValueAndState(IPropertyStoreCache *iface, REFPROPERTYKEY key, PROPVARIANT *ppropvar, PSC_STATE *pstate) { - FIXME("%p,%p,%p,%p: stub\n", iface, key, ppropvar, pstate); - return E_NOTIMPL; + PropertyStore *This = impl_from_IPropertyStoreCache(iface); + propstore_value *value; + HRESULT hr; + + TRACE("%p,%p,%p,%p\n", iface, key, ppropvar, pstate); + + EnterCriticalSection(&This->lock); + + hr = PropertyStore_LookupValue(This, key, 0, &value); + + if (SUCCEEDED(hr)) + hr = PropVariantCopy(ppropvar, &value->propvar); + + if (SUCCEEDED(hr)) + *pstate = value->state; + + LeaveCriticalSection(&This->lock); + + if (FAILED(hr)) + { + PropVariantInit(ppropvar); + *pstate = PSC_NORMAL; + } + + return hr; } static HRESULT WINAPI PropertyStore_SetState(IPropertyStoreCache *iface, diff --git a/dlls/propsys/tests/propstore.c b/dlls/propsys/tests/propstore.c index 17cf7f3ba92..ad06ea006e9 100644 --- a/dlls/propsys/tests/propstore.c +++ b/dlls/propsys/tests/propstore.c @@ -138,9 +138,9 @@ static void test_inmemorystore(void) propvar.vt = VT_I2; state = 0xdeadbeef; hr = IPropertyStoreCache_GetValueAndState(propcache, &pkey, &propvar, &state); - todo_wine ok(hr == TYPE_E_ELEMENTNOTFOUND, "GetValueAndState failed, hr=%x\n", hr); - todo_wine ok(propvar.vt == VT_EMPTY, "expected VT_EMPTY, got %d\n", propvar.vt); - todo_wine ok(state == PSC_NORMAL, "expected PSC_NORMAL, got %d\n", state); + ok(hr == TYPE_E_ELEMENTNOTFOUND, "GetValueAndState failed, hr=%x\n", hr); + ok(propvar.vt == VT_EMPTY, "expected VT_EMPTY, got %d\n", propvar.vt); + ok(state == PSC_NORMAL, "expected PSC_NORMAL, got %d\n", state); /* Set state on an unset field */ hr = IPropertyStoreCache_SetState(propcache, &pkey, PSC_NORMAL); @@ -171,8 +171,8 @@ static void test_inmemorystore(void) memset(&propvar, 0, sizeof(propvar)); state = 0xdeadbeef; hr = IPropertyStoreCache_GetValueAndState(propcache, &pkey, &propvar, &state); - todo_wine ok(hr == S_OK, "GetValueAndState failed, hr=%x\n", hr); - todo_wine ok(propvar.vt == VT_I4, "expected VT_I4, got %d\n", propvar.vt); + ok(hr == S_OK, "GetValueAndState failed, hr=%x\n", hr); + ok(propvar.vt == VT_I4, "expected VT_I4, got %d\n", propvar.vt); todo_wine ok(propvar.u.lVal == 12346, "expected 12346, got %d\n", propvar.vt); todo_wine ok(state == 5, "expected 5, got %d\n", state);