From: Zhiyi Zhang zzhang@codeweavers.com
--- dlls/wintypes/main.c | 34 +++++++++++++++++++++++++++++++++- dlls/wintypes/tests/wintypes.c | 2 ++ 2 files changed, 35 insertions(+), 1 deletion(-)
diff --git a/dlls/wintypes/main.c b/dlls/wintypes/main.c index c27d8964d80..a04ac7706bc 100644 --- a/dlls/wintypes/main.c +++ b/dlls/wintypes/main.c @@ -398,6 +398,7 @@ struct property_value IPropertyValue IPropertyValue_iface; union { + IReference_BYTE byte_iface; IReference_UINT32 uint32_iface; IReference_boolean boolean_iface; IReference_DOUBLE double_iface; @@ -464,6 +465,12 @@ static HRESULT STDMETHODCALLTYPE property_value_QueryInterface(IPropertyValue *i *out = &impl->IPropertyValue_iface; return S_OK; } + else if (IsEqualIID(riid, &IID_IReference_BYTE) && impl->type == PropertyType_UInt8) + { + IReference_BYTE_AddRef(&impl->irefs.byte_iface); + *out = &impl->irefs.byte_iface; + return S_OK; + } else if (IsEqualIID(riid, &IID_IReference_UINT32) && impl->type == PropertyType_UInt32) { IReference_UINT32_AddRef(&impl->irefs.uint32_iface); @@ -879,6 +886,31 @@ static HRESULT _create_primitive_property_value(PropertyType type, void *value, return hr; \ } while (0)
+DEFINE_IINSPECTABLE_(iref_byte, IReference_BYTE, struct property_value, + impl_from_IReference_BYTE, irefs.byte_iface, &impl->IPropertyValue_iface); + +static HRESULT STDMETHODCALLTYPE iref_byte_get_Value(IReference_BYTE *iface, UINT8 *value) +{ + struct property_value *impl = impl_from_IReference_BYTE(iface); + + TRACE("iface %p, value %p.\n", iface, value); + + return property_value_GetUInt8(&impl->IPropertyValue_iface, value); +} + +static const struct IReference_BYTEVtbl iref_byte_vtbl = +{ + iref_byte_QueryInterface, + iref_byte_AddRef, + iref_byte_Release, + /* IInspectable methods */ + iref_byte_GetIids, + iref_byte_GetRuntimeClassName, + iref_byte_GetTrustLevel, + /* IReference<BYTE> methods */ + iref_byte_get_Value, +}; + DEFINE_IINSPECTABLE_(iref_uint32, IReference_UINT32, struct property_value, impl_from_IReference_UINT32, irefs.uint32_iface, &impl->IPropertyValue_iface);
@@ -997,7 +1029,7 @@ static HRESULT STDMETHODCALLTYPE property_value_statics_CreateUInt8(IPropertyVal BYTE value, IInspectable **property_value) { TRACE("iface %p, value %#x, property_value %p.\n", iface, value, property_value); - return create_primitive_property_value(PropertyType_UInt8); + create_primitive_property_value_iref(PropertyType_UInt8, irefs.byte_iface.lpVtbl, iref_byte_vtbl); }
static HRESULT STDMETHODCALLTYPE property_value_statics_CreateInt16(IPropertyValueStatics *iface, diff --git a/dlls/wintypes/tests/wintypes.c b/dlls/wintypes/tests/wintypes.c index a0d293c692e..f4799151df1 100644 --- a/dlls/wintypes/tests/wintypes.c +++ b/dlls/wintypes/tests/wintypes.c @@ -736,6 +736,7 @@ static void test_IPropertyValueStatics(void) IInspectable *inspectable = NULL, *tmp_inspectable = NULL; IPropertyValueStatics *statics = NULL; IActivationFactory *factory = NULL; + IReference_BYTE *iref_byte; IReference_UINT32 *iref_uint32; IReference_boolean *iref_boolean; IReference_HSTRING *iref_hstring; @@ -998,6 +999,7 @@ static void test_IPropertyValueStatics(void) IInspectable_Release(inspectable); \ } while (0);
+ TEST_PROPERTY_VALUE_IREFERENCE(UInt8, IReference_BYTE, byte_value, iref_byte, byte) TEST_PROPERTY_VALUE_IREFERENCE(UInt32, IReference_UINT32, uint32_value, iref_uint32, ret_uint32) TEST_PROPERTY_VALUE_IREFERENCE(Boolean, IReference_boolean, boolean_value, iref_boolean, ret) TEST_PROPERTY_VALUE_IREFERENCE(String, IReference_HSTRING, str, iref_hstring, ret_str)