[PATCH v2 2/4] windows.media.speech: Implement IInstalledVoicesStatic stub.
Jacek Caban
jacek at codeweavers.com
Fri Mar 5 07:51:21 CST 2021
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.
Thanks,
Jacek
More information about the wine-devel
mailing list