[PATCH v2 2/4] windows.media.speech: Implement IInstalledVoicesStatic stub.
Zebediah Figura (she/her)
zfigura at codeweavers.com
Fri Mar 5 10:21:18 CST 2021
On 3/5/21 7:51 AM, Jacek Caban wrote:
> Hi Rémi,
>
> The series looks better now, but it has some COM problems. Also, there
> is not much to test yet, but it would still be interesting to see some
> basic creation and QueryInterface tests.
>
> On 05.03.2021 09:53, Rémi Bernon wrote:
>> Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
>> ---
>> dlls/windows.media.speech.dll/main.c | 104 +++++++++++++++++++++++++++
>> 1 file changed, 104 insertions(+)
>>
>> diff --git a/dlls/windows.media.speech.dll/main.c b/dlls/windows.media.speech.dll/main.c
>> index 909ea6db748..db57acac651 100644
>> --- a/dlls/windows.media.speech.dll/main.c
>> +++ b/dlls/windows.media.speech.dll/main.c
>> @@ -29,7 +29,10 @@
>> #include "initguid.h"
>> #include "activation.h"
>>
>> +#define WIDL_using_Windows_Foundation
>> +#define WIDL_using_Windows_Foundation_Collections
>> #include "windows.foundation.h"
>> +#define WIDL_using_Windows_Media_SpeechSynthesis
>> #include "windows.media.speechsynthesis.h"
>>
>> WINE_DEFAULT_DEBUG_CHANNEL(speech);
>> @@ -46,6 +49,7 @@ static const char *debugstr_hstring(HSTRING hstr)
>> struct windows_media_speech
>> {
>> IActivationFactory IActivationFactory_iface;
>> + IInstalledVoicesStatic IInstalledVoicesStatic_iface;
>> LONG ref;
>> };
>>
>> @@ -54,6 +58,98 @@ static inline struct windows_media_speech *impl_from_IActivationFactory(IActivat
>> return CONTAINING_RECORD(iface, struct windows_media_speech, IActivationFactory_iface);
>> }
>>
>> +static inline struct windows_media_speech *impl_from_IInstalledVoicesStatic(IInstalledVoicesStatic *iface)
>> +{
>> + return CONTAINING_RECORD(iface, struct windows_media_speech, IInstalledVoicesStatic_iface);
>> +}
>> +
>> +static HRESULT STDMETHODCALLTYPE installed_voices_static_QueryInterface(
>> + IInstalledVoicesStatic *iface, REFIID iid, void **out)
>> +{
>> + TRACE("iface %p, iid %s, out %p stub!\n", iface, debugstr_guid(iid), out);
>> +
>> + if (IsEqualGUID(iid, &IID_IUnknown) ||
>> + IsEqualGUID(iid, &IID_IAgileObject) ||
>> + IsEqualGUID(iid, &IID_IInspectable) ||
>> + IsEqualGUID(iid, &IID_IInstalledVoicesStatic))
>> + {
>> + IUnknown_AddRef(iface);
>> + *out = iface;
>> + return S_OK;
>> + }
>> +
>> + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
>> + *out = NULL;
>> + return E_NOINTERFACE;
>> +}
>
>
> It's missing IActivationFactrory interface.
>
>
>> @@ -69,6 +165,13 @@ static HRESULT STDMETHODCALLTYPE windows_media_speech_QueryInterface(
>> return S_OK;
>> }
>>
>> + if (IsEqualGUID(iid, &IID_IInstalledVoicesStatic))
>> + {
>> + IUnknown_AddRef(iface);
>> + *out = &impl->IInstalledVoicesStatic_iface;
>> + return S_OK;
>> + }
>
>
> It's missing IID_IAgileObject interface now and it generally just
> duplicates installed_voices_static_QueryInterface. The usual practice is
> to have one QueryInterface implementation per object and forward other
> calls. Same for AddRef and Release (at least in case where we have
> actual ref counting).
>
>
> Note static objects don't need ref counting at all, because you don't
> have the destructor anyway. If there is a reason to have reference
> counting, then patch 3 is missing AddRef call.
>
>
> Static object also don't really need a structs like
> windows_media_speech, but it's fine to have it. However,
> IVectorView_VoiceInformation doesn't really belong to
> windows_media_speech object as it looks like a separate object.
As far as I can tell, it's not a mutable interface and therefore doesn't
need to be made into a separate object, right?
>
>
> Thanks,
>
> Jacek
>
>
More information about the wine-devel
mailing list