From: Piotr Caban piotr@codeweavers.com
--- dlls/ole32/stg_prop.c | 32 +++++++++++++++----------------- dlls/ole32/tests/stg_prop.c | 29 +++++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 19 deletions(-)
diff --git a/dlls/ole32/stg_prop.c b/dlls/ole32/stg_prop.c index 3446ec9dafd..ee28d6b6898 100644 --- a/dlls/ole32/stg_prop.c +++ b/dlls/ole32/stg_prop.c @@ -539,7 +539,8 @@ static HRESULT WINAPI IPropertyStorage_fnReadMultiple( PROPVARIANT rgpropvar[]) { PropertyStorage_impl *This = impl_from_IPropertyStorage(iface); - HRESULT hr = S_OK; + HRESULT hr = S_FALSE; + PROPVARIANT *prop; ULONG i;
TRACE("%p, %lu, %p, %p\n", iface, cpspec, rgpspec, rgpropvar); @@ -554,12 +555,7 @@ static HRESULT WINAPI IPropertyStorage_fnReadMultiple( PropVariantInit(&rgpropvar[i]); if (rgpspec[i].ulKind == PRSPEC_LPWSTR) { - PROPVARIANT *prop = PropertyStorage_FindPropertyByName(This, - rgpspec[i].lpwstr); - - if (prop) - PropertyStorage_PropVariantCopy(&rgpropvar[i], prop, GetACP(), - This->codePage); + prop = PropertyStorage_FindPropertyByName(This, rgpspec[i].lpwstr); } else { @@ -568,24 +564,26 @@ static HRESULT WINAPI IPropertyStorage_fnReadMultiple( case PID_CODEPAGE: rgpropvar[i].vt = VT_I2; rgpropvar[i].iVal = This->codePage; + prop = NULL; + hr = S_OK; break; case PID_LOCALE: rgpropvar[i].vt = VT_I4; rgpropvar[i].lVal = This->locale; + prop = NULL; + hr = S_OK; break; default: - { - PROPVARIANT *prop = PropertyStorage_FindProperty(This, - rgpspec[i].propid); - - if (prop) - PropertyStorage_PropVariantCopy(&rgpropvar[i], prop, - GetACP(), This->codePage); - else - hr = S_FALSE; - } + prop = PropertyStorage_FindProperty(This, rgpspec[i].propid); + break; } } + + if (prop) + { + PropertyStorage_PropVariantCopy(&rgpropvar[i], prop, GetACP(), This->codePage); + hr = S_OK; + } } LeaveCriticalSection(&This->cs); return hr; diff --git a/dlls/ole32/tests/stg_prop.c b/dlls/ole32/tests/stg_prop.c index 128de9fc72e..17f361d57ef 100644 --- a/dlls/ole32/tests/stg_prop.c +++ b/dlls/ole32/tests/stg_prop.c @@ -40,8 +40,8 @@ static void testPropsHelper(IPropertySetStorage **propSetStorage) IStorage *storage = NULL; IStream *stream = NULL; IPropertyStorage *propertyStorage = NULL; - PROPSPEC spec; - PROPVARIANT var; + PROPSPEC spec, spec2[2]; + PROPVARIANT var, var2[2]; CLIPDATA clipdata; unsigned char clipcontent[] = "foobar"; GUID anyOldGuid = { 0x12345678,0xdead,0xbeef, { @@ -179,6 +179,31 @@ static void testPropsHelper(IPropertySetStorage **propSetStorage) var.vt, var.pszVal); PropVariantClear(&var);
+ /* test read with some missing properties */ + spec2[0].ulKind = PRSPEC_PROPID; + spec2[0].propid = PID_FIRST_USABLE; + spec2[1].ulKind = PRSPEC_PROPID; + spec2[1].propid = 0xdead; + var2[0].vt = VT_BSTR; + var2[1].vt = VT_BSTR; + hr = IPropertyStorage_ReadMultiple(propertyStorage, 2, spec2, var2); + ok(hr == S_OK, "ReadMultiple failed: 0x%08lx\n", hr); + ok(var2[0].vt == VT_I4, "got type %d\n", var2[0].vt); + ok(var2[0].lVal == 1, "got value %ld\n", var2[0].lVal); + ok(var2[1].vt == VT_EMPTY, "got type %d\n", var2[1].vt); + + spec2[0].ulKind = PRSPEC_LPWSTR; + spec2[0].lpwstr = propName; + spec2[1].ulKind = PRSPEC_LPWSTR; + spec2[1].lpwstr = (WCHAR *)L"non-existing"; + var2[0].vt = VT_BSTR; + var2[1].vt = VT_BSTR; + hr = IPropertyStorage_ReadMultiple(propertyStorage, 2, spec2, var2); + ok(hr == S_OK, "ReadMultiple failed: 0x%08lx\n", hr); + ok(var2[0].vt == VT_I4, "got type %d\n", var2[0].vt); + ok(var2[0].lVal == 2, "got value %ld\n", var2[0].lVal); + ok(var2[1].vt == VT_EMPTY, "got type %d\n", var2[1].vt); + /* read clipboard format */ spec.ulKind = PRSPEC_PROPID; spec.propid = PIDSI_THUMBNAIL;