From: Shaun Ren shaun.ren@linux.com
--- dlls/sapi/main.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
diff --git a/dlls/sapi/main.c b/dlls/sapi/main.c index 108db7d13d8..c8cd06f004b 100644 --- a/dlls/sapi/main.c +++ b/dlls/sapi/main.c @@ -145,3 +145,15 @@ HRESULT WINAPI DllGetClassObject( REFCLSID clsid, REFIID iid, void **obj )
return IClassFactory_QueryInterface( cf, iid, obj ); } + +/****************************************************************** + * DllMain + */ +BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, void *reserved ) +{ + if (reason == DLL_PROCESS_DETACH && !reserved) + { + release_typelib(); + } + return TRUE; +}
From: Shaun Ren shaun.ren@linux.com
--- dlls/sapi/tests/tts.c | 9 +++++++++ dlls/sapi/tts.c | 6 ++++-- 2 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/dlls/sapi/tests/tts.c b/dlls/sapi/tests/tts.c index 38ec1d31bfc..87711eac61a 100644 --- a/dlls/sapi/tests/tts.c +++ b/dlls/sapi/tests/tts.c @@ -431,6 +431,7 @@ static void test_spvoice(void) ULONG stream_num; DWORD regid; DWORD start, duration; + ISpeechVoice *speech_voice; HRESULT hr;
if (waveOutGetNumDevs() == 0) { @@ -681,6 +682,14 @@ static void test_spvoice(void) ok(hr == S_OK, "got %#lx.\n", hr); ok(duration < 300, "took %lu ms.\n", duration);
+ hr = ISpVoice_QueryInterface(voice, &IID_ISpeechVoice, (void **)&speech_voice); + ok(hr == S_OK, "got %#lx.\n", hr); + + hr = ISpeechVoice_Speak(speech_voice, NULL, SVSFPurgeBeforeSpeak, NULL); + ok(hr == S_OK, "got %#lx.\n", hr); + + ISpeechVoice_Release(speech_voice); + done: reset_engine_params(&test_engine); ISpVoice_Release(voice); diff --git a/dlls/sapi/tts.c b/dlls/sapi/tts.c index c2e36fc274d..e719a544a01 100644 --- a/dlls/sapi/tts.c +++ b/dlls/sapi/tts.c @@ -357,9 +357,11 @@ static HRESULT WINAPI speech_voice_get_SynchronousSpeakTimeout(ISpeechVoice *ifa
static HRESULT WINAPI speech_voice_Speak(ISpeechVoice *iface, BSTR text, SpeechVoiceSpeakFlags flags, LONG *number) { - FIXME("(%p, %s, %#x, %p): stub.\n", iface, debugstr_w(text), flags, number); + struct speech_voice *This = impl_from_ISpeechVoice(iface);
- return E_NOTIMPL; + TRACE("(%p, %s, %#x, %p).\n", iface, debugstr_w(text), flags, number); + + return ISpVoice_Speak(&This->ISpVoice_iface, text, flags, (ULONG *)number); }
static HRESULT WINAPI speech_voice_SpeakStream(ISpeechVoice *iface, ISpeechBaseStream *stream,
From: Shaun Ren shaun.ren@linux.com
--- dlls/sapi/tests/token.c | 10 ++++++++++ dlls/sapi/token.c | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-)
diff --git a/dlls/sapi/tests/token.c b/dlls/sapi/tests/token.c index 6d2c40ea154..c7067718c45 100644 --- a/dlls/sapi/tests/token.c +++ b/dlls/sapi/tests/token.c @@ -205,6 +205,16 @@ static void test_token_category(void)
IEnumSpObjectTokens_Release( enum_tokens );
+ hr = ISpObjectTokenCategory_EnumTokens( cat, L"", NULL, &enum_tokens ); + ok( hr == S_OK, "got %08lx\n", hr ); + + count = 0xdeadbeef; + hr = IEnumSpObjectTokens_GetCount( enum_tokens, &count ); + ok( hr == S_OK, "got %08lx\n", hr ); + ok( count == 5, "got %lu\n", count ); + + IEnumSpObjectTokens_Release( enum_tokens ); + hr = ISpObjectTokenCategory_EnumTokens( cat, L"Language=409", NULL, &enum_tokens ); ok( hr == S_OK, "got %08lx\n", hr );
diff --git a/dlls/sapi/token.c b/dlls/sapi/token.c index ad8163c9567..65d35dc96ff 100644 --- a/dlls/sapi/token.c +++ b/dlls/sapi/token.c @@ -947,7 +947,7 @@ static HRESULT score_attributes( ISpObjectToken *token, const WCHAR *attrs, unsigned int i, j; HRESULT hr;
- if (!attrs) + if (!attrs || !*attrs) { *score = 1; return S_OK;
From: Shaun Ren shaun.ren@linux.com
--- dlls/sapi/tts.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-)
diff --git a/dlls/sapi/tts.c b/dlls/sapi/tts.c index e719a544a01..381558659b8 100644 --- a/dlls/sapi/tts.c +++ b/dlls/sapi/tts.c @@ -82,6 +82,15 @@ static inline struct tts_engine_site *impl_from_ISpTTSEngineSite(ISpTTSEngineSit return CONTAINING_RECORD(iface, struct tts_engine_site, ISpTTSEngineSite_iface); }
+static HRESULT create_token_category(const WCHAR *cat_id, ISpObjectTokenCategory **cat) +{ + HRESULT hr; + if (FAILED(hr = CoCreateInstance(&CLSID_SpObjectTokenCategory, NULL, CLSCTX_INPROC_SERVER, + &IID_ISpObjectTokenCategory, (void **)cat))) + return hr; + return ISpObjectTokenCategory_SetId(*cat, cat_id, FALSE); +} + static HRESULT create_default_token(const WCHAR *cat_id, ISpObjectToken **token) { ISpObjectTokenCategory *cat; @@ -90,17 +99,13 @@ static HRESULT create_default_token(const WCHAR *cat_id, ISpObjectToken **token)
TRACE("(%s, %p).\n", debugstr_w(cat_id), token);
- if (FAILED(hr = CoCreateInstance(&CLSID_SpObjectTokenCategory, NULL, CLSCTX_INPROC_SERVER, - &IID_ISpObjectTokenCategory, (void **)&cat))) + if (FAILED(hr = create_token_category(cat_id, &cat))) return hr;
- if (FAILED(hr = ISpObjectTokenCategory_SetId(cat, cat_id, FALSE)) || - FAILED(hr = ISpObjectTokenCategory_GetDefaultTokenId(cat, &default_token_id))) - { - ISpObjectTokenCategory_Release(cat); - return hr; - } + hr = ISpObjectTokenCategory_GetDefaultTokenId(cat, &default_token_id); ISpObjectTokenCategory_Release(cat); + if (FAILED(hr)) + return hr;
if (FAILED(hr = CoCreateInstance(&CLSID_SpObjectToken, NULL, CLSCTX_INPROC_SERVER, &IID_ISpObjectToken, (void **)token)))
From: Shaun Ren shaun.ren@linux.com
--- dlls/sapi/tests/tts.c | 31 +++++++++++++++++++++++++++++-- dlls/sapi/tts.c | 21 +++++++++++++++++++-- 2 files changed, 48 insertions(+), 4 deletions(-)
diff --git a/dlls/sapi/tests/tts.c b/dlls/sapi/tests/tts.c index 87711eac61a..8f88d74b9ef 100644 --- a/dlls/sapi/tests/tts.c +++ b/dlls/sapi/tests/tts.c @@ -416,7 +416,7 @@ static IClassFactory test_engine_cf = { &ClassFactoryVtbl };
static void test_spvoice(void) { - static const WCHAR test_token_id[] = L"HKEY_LOCAL_MACHINE\Software\Wine\Winetest\sapi\tts\TestEngine"; + static const WCHAR test_token_id[] = L"HKEY_LOCAL_MACHINE\Software\Microsoft\Speech\Voices\Tokens\WinetestVoice"; static const WCHAR test_text[] = L"Hello! This is a test sentence.";
ISpVoice *voice; @@ -432,6 +432,9 @@ static void test_spvoice(void) DWORD regid; DWORD start, duration; ISpeechVoice *speech_voice; + ISpeechObjectTokens *speech_tokens; + LONG count; + BSTR req = NULL, opt = NULL; HRESULT hr;
if (waveOutGetNumDevs() == 0) { @@ -439,6 +442,8 @@ static void test_spvoice(void) return; }
+ RegDeleteTreeA(HKEY_LOCAL_MACHINE, "Software\Microsoft\Speech\Voices\WinetestVoice"); + check_apttype(); ok(test_apt_data.type == APTTYPE_UNITIALIZED, "got apt type %d.\n", test_apt_data.type);
@@ -588,6 +593,7 @@ static void test_spvoice(void) hr = ISpObjectToken_CreateKey(token, L"Attributes", &attrs_key); ok(hr == S_OK, "got %#lx.\n", hr); ISpDataKey_SetStringValue(attrs_key, L"Language", L"409"); + ISpDataKey_SetStringValue(attrs_key, L"Vendor", L"Winetest"); ISpDataKey_Release(attrs_key);
hr = ISpVoice_SetVoice(voice, token); @@ -685,6 +691,25 @@ static void test_spvoice(void) hr = ISpVoice_QueryInterface(voice, &IID_ISpeechVoice, (void **)&speech_voice); ok(hr == S_OK, "got %#lx.\n", hr);
+ count = -1; + hr = ISpeechVoice_GetVoices(speech_voice, NULL, NULL, &speech_tokens); + ok(hr == S_OK, "got %#lx.\n", hr); + hr = ISpeechObjectTokens_get_Count(speech_tokens, &count); + ok(hr == S_OK, "got %#lx.\n", hr); + ok(count > 0, "got %ld.\n", count); + ISpeechObjectTokens_Release(speech_tokens); + + req = SysAllocString(L"Vendor=Winetest"); + opt = SysAllocString(L"Language=409;Gender=Male"); + + count = 0xdeadbeef; + hr = ISpeechVoice_GetVoices(speech_voice, req, opt, &speech_tokens); + ok(hr == S_OK, "got %#lx.\n", hr); + hr = ISpeechObjectTokens_get_Count(speech_tokens, &count); + ok(hr == S_OK, "got %#lx.\n", hr); + ok(count == 1, "got %ld.\n", count); + ISpeechObjectTokens_Release(speech_tokens); + hr = ISpeechVoice_Speak(speech_voice, NULL, SVSFPurgeBeforeSpeak, NULL); ok(hr == S_OK, "got %#lx.\n", hr);
@@ -695,8 +720,10 @@ done: ISpVoice_Release(voice); ISpObjectToken_Release(token); ISpMMSysAudio_Release(audio_out); + SysFreeString(req); + SysFreeString(opt);
- RegDeleteTreeA( HKEY_LOCAL_MACHINE, "Software\Wine\Winetest\sapi" ); + RegDeleteTreeA(HKEY_LOCAL_MACHINE, "Software\Microsoft\Speech\Voices\WinetestVoice"); }
START_TEST(tts) diff --git a/dlls/sapi/tts.c b/dlls/sapi/tts.c index 381558659b8..6fe01373e56 100644 --- a/dlls/sapi/tts.c +++ b/dlls/sapi/tts.c @@ -401,9 +401,26 @@ static HRESULT WINAPI speech_voice_Skip(ISpeechVoice *iface, const BSTR type, LO static HRESULT WINAPI speech_voice_GetVoices(ISpeechVoice *iface, BSTR required, BSTR optional, ISpeechObjectTokens **tokens) { - FIXME("(%p, %s, %s, %p): stub.\n", iface, debugstr_w(required), debugstr_w(optional), tokens);
- return E_NOTIMPL; + ISpObjectTokenCategory *cat; + IEnumSpObjectTokens *token_enum; + HRESULT hr; + + TRACE("(%p, %s, %s, %p).\n", iface, debugstr_w(required), debugstr_w(optional), tokens); + + if (!tokens) return E_POINTER; + + if (FAILED(hr = create_token_category(SPCAT_VOICES, &cat))) + return hr; + + if (SUCCEEDED(hr = ISpObjectTokenCategory_EnumTokens(cat, required, optional, &token_enum))) + { + hr = IEnumSpObjectTokens_QueryInterface(token_enum, &IID_ISpeechObjectTokens, (void **)tokens); + IEnumSpObjectTokens_Release(token_enum); + } + + ISpObjectTokenCategory_Release(cat); + return hr; }
static HRESULT WINAPI speech_voice_GetAudioOutputs(ISpeechVoice *iface, BSTR required, BSTR optional,
From: Shaun Ren shaun.ren@linux.com
--- dlls/sapi/tests/tts.c | 6 ++++++ dlls/sapi/tts.c | 8 ++++---- 2 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/dlls/sapi/tests/tts.c b/dlls/sapi/tests/tts.c index 8f88d74b9ef..8f18934fce3 100644 --- a/dlls/sapi/tests/tts.c +++ b/dlls/sapi/tests/tts.c @@ -435,6 +435,7 @@ static void test_spvoice(void) ISpeechObjectTokens *speech_tokens; LONG count; BSTR req = NULL, opt = NULL; + UINT info_count; HRESULT hr;
if (waveOutGetNumDevs() == 0) { @@ -713,6 +714,11 @@ static void test_spvoice(void) hr = ISpeechVoice_Speak(speech_voice, NULL, SVSFPurgeBeforeSpeak, NULL); ok(hr == S_OK, "got %#lx.\n", hr);
+ info_count = 0xdeadbeef; + hr = ISpeechVoice_GetTypeInfoCount(speech_voice, &info_count); + ok(hr == S_OK, "got %#lx.\n", hr); + ok(info_count == 1, "got %u.\n", info_count); + ISpeechVoice_Release(speech_voice);
done: diff --git a/dlls/sapi/tts.c b/dlls/sapi/tts.c index 6fe01373e56..2493a2804f2 100644 --- a/dlls/sapi/tts.c +++ b/dlls/sapi/tts.c @@ -179,11 +179,11 @@ static ULONG WINAPI speech_voice_Release(ISpeechVoice *iface) return ref; }
-static HRESULT WINAPI speech_voice_GetTypeInfoCount(ISpeechVoice *iface, UINT *info) +static HRESULT WINAPI speech_voice_GetTypeInfoCount(ISpeechVoice *iface, UINT *count) { - FIXME("(%p, %p): stub.\n", iface, info); - - return E_NOTIMPL; + TRACE("(%p, %p).\n", iface, count); + *count = 1; + return S_OK; }
static HRESULT WINAPI speech_voice_GetTypeInfo(ISpeechVoice *iface, UINT info, LCID lcid,
From: Shaun Ren shaun.ren@linux.com
--- dlls/sapi/dispatch.c | 1 + dlls/sapi/sapi_private.h | 1 + dlls/sapi/tests/tts.c | 13 +++++++++++++ dlls/sapi/tts.c | 8 ++++---- 4 files changed, 19 insertions(+), 4 deletions(-)
diff --git a/dlls/sapi/dispatch.c b/dlls/sapi/dispatch.c index 731ae9ae48f..c1f0e842788 100644 --- a/dlls/sapi/dispatch.c +++ b/dlls/sapi/dispatch.c @@ -36,6 +36,7 @@ static REFIID tid_id[] = { &IID_ISpeechObjectToken, &IID_ISpeechObjectTokens, + &IID_ISpeechVoice, };
HRESULT get_typeinfo(enum type_id tid, ITypeInfo **ret) diff --git a/dlls/sapi/sapi_private.h b/dlls/sapi/sapi_private.h index 55e1460ad38..219436f88c1 100644 --- a/dlls/sapi/sapi_private.h +++ b/dlls/sapi/sapi_private.h @@ -57,6 +57,7 @@ enum type_id { ISpeechObjectToken_tid, ISpeechObjectTokens_tid, + ISpeechVoice_tid, last_tid };
diff --git a/dlls/sapi/tests/tts.c b/dlls/sapi/tests/tts.c index 8f18934fce3..111d0a0bc6c 100644 --- a/dlls/sapi/tests/tts.c +++ b/dlls/sapi/tests/tts.c @@ -436,6 +436,8 @@ static void test_spvoice(void) LONG count; BSTR req = NULL, opt = NULL; UINT info_count; + ITypeInfo *typeinfo; + TYPEATTR *typeattr; HRESULT hr;
if (waveOutGetNumDevs() == 0) { @@ -719,6 +721,17 @@ static void test_spvoice(void) ok(hr == S_OK, "got %#lx.\n", hr); ok(info_count == 1, "got %u.\n", info_count);
+ typeinfo = NULL; + typeattr = NULL; + hr = ISpeechVoice_GetTypeInfo(speech_voice, 0, 0, &typeinfo); + ok(hr == S_OK, "got %#lx.\n", hr); + hr = ITypeInfo_GetTypeAttr(typeinfo, &typeattr); + ok(hr == S_OK, "got %#lx.\n", hr); + ok(typeattr->typekind == TKIND_DISPATCH, "got %u.\n", typeattr->typekind); + ok(IsEqualGUID(&typeattr->guid, &IID_ISpeechVoice), "got %s.\n", wine_dbgstr_guid(&typeattr->guid)); + ITypeInfo_ReleaseTypeAttr(typeinfo, typeattr); + ITypeInfo_Release(typeinfo); + ISpeechVoice_Release(speech_voice);
done: diff --git a/dlls/sapi/tts.c b/dlls/sapi/tts.c index 2493a2804f2..8e597252b31 100644 --- a/dlls/sapi/tts.c +++ b/dlls/sapi/tts.c @@ -186,12 +186,12 @@ static HRESULT WINAPI speech_voice_GetTypeInfoCount(ISpeechVoice *iface, UINT *c return S_OK; }
-static HRESULT WINAPI speech_voice_GetTypeInfo(ISpeechVoice *iface, UINT info, LCID lcid, +static HRESULT WINAPI speech_voice_GetTypeInfo(ISpeechVoice *iface, UINT index, LCID lcid, ITypeInfo **type_info) { - FIXME("(%p, %u, %lu, %p): stub.\n", iface, info, lcid, type_info); - - return E_NOTIMPL; + TRACE("(%p, %u, %#lx, %p).\n", iface, index, lcid, type_info); + if (index != 0) return DISP_E_BADINDEX; + return get_typeinfo(ISpeechVoice_tid, type_info); }
static HRESULT WINAPI speech_voice_GetIDsOfNames(ISpeechVoice *iface, REFIID riid, LPOLESTR *names,
From: Shaun Ren shaun.ren@linux.com
--- dlls/sapi/tests/tts.c | 7 +++++++ dlls/sapi/tts.c | 13 ++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-)
diff --git a/dlls/sapi/tests/tts.c b/dlls/sapi/tests/tts.c index 111d0a0bc6c..7566bd5c5cb 100644 --- a/dlls/sapi/tests/tts.c +++ b/dlls/sapi/tests/tts.c @@ -418,6 +418,7 @@ static void test_spvoice(void) { static const WCHAR test_token_id[] = L"HKEY_LOCAL_MACHINE\Software\Microsoft\Speech\Voices\Tokens\WinetestVoice"; static const WCHAR test_text[] = L"Hello! This is a test sentence."; + static const WCHAR *get_voices = L"GetVoices";
ISpVoice *voice; IUnknown *dummy; @@ -438,6 +439,7 @@ static void test_spvoice(void) UINT info_count; ITypeInfo *typeinfo; TYPEATTR *typeattr; + DISPID dispid; HRESULT hr;
if (waveOutGetNumDevs() == 0) { @@ -732,6 +734,11 @@ static void test_spvoice(void) ITypeInfo_ReleaseTypeAttr(typeinfo, typeattr); ITypeInfo_Release(typeinfo);
+ dispid = 0xdeadbeef; + hr = ISpeechVoice_GetIDsOfNames(speech_voice, &IID_NULL, (WCHAR **)&get_voices, 1, 0x409, &dispid); + ok(hr == S_OK, "got %#lx.\n", hr); + ok(dispid == DISPID_SVGetVoices, "got %#lx.\n", dispid); + ISpeechVoice_Release(speech_voice);
done: diff --git a/dlls/sapi/tts.c b/dlls/sapi/tts.c index 8e597252b31..d08b0c5de22 100644 --- a/dlls/sapi/tts.c +++ b/dlls/sapi/tts.c @@ -195,11 +195,18 @@ static HRESULT WINAPI speech_voice_GetTypeInfo(ISpeechVoice *iface, UINT index, }
static HRESULT WINAPI speech_voice_GetIDsOfNames(ISpeechVoice *iface, REFIID riid, LPOLESTR *names, - UINT count, LCID lcid, DISPID *dispid) + UINT count, LCID lcid, DISPID *dispids) { - FIXME("(%p, %s, %p, %u, %lu, %p): stub.\n", iface, debugstr_guid(riid), names, count, lcid, dispid); + ITypeInfo *typeinfo; + HRESULT hr;
- return E_NOTIMPL; + TRACE("(%p, %s, %p, %u, %#lx, %p).\n", iface, debugstr_guid(riid), names, count, lcid, dispids); + + if (FAILED(hr = get_typeinfo(ISpeechVoice_tid, &typeinfo))) + return hr; + hr = ITypeInfo_GetIDsOfNames(typeinfo, names, count, dispids); + ITypeInfo_Release(typeinfo); + return hr; }
static HRESULT WINAPI speech_voice_Invoke(ISpeechVoice *iface, DISPID dispid, REFIID riid, LCID lcid,
From: Shaun Ren shaun.ren@linux.com
--- dlls/sapi/tests/tts.c | 25 +++++++++++++++++++++++++ dlls/sapi/tts.c | 11 +++++++++-- 2 files changed, 34 insertions(+), 2 deletions(-)
diff --git a/dlls/sapi/tests/tts.c b/dlls/sapi/tests/tts.c index 7566bd5c5cb..4d565b35294 100644 --- a/dlls/sapi/tests/tts.c +++ b/dlls/sapi/tests/tts.c @@ -440,6 +440,8 @@ static void test_spvoice(void) ITypeInfo *typeinfo; TYPEATTR *typeattr; DISPID dispid; + DISPPARAMS params; + VARIANT args[2], ret; HRESULT hr;
if (waveOutGetNumDevs() == 0) { @@ -739,6 +741,29 @@ static void test_spvoice(void) ok(hr == S_OK, "got %#lx.\n", hr); ok(dispid == DISPID_SVGetVoices, "got %#lx.\n", dispid);
+ memset(¶ms, 0, sizeof(params)); + params.cArgs = 2; + params.cNamedArgs = 0; + params.rgvarg = args; + VariantInit(&args[0]); + VariantInit(&args[1]); + V_VT(&args[0]) = VT_BSTR; + V_VT(&args[1]) = VT_BSTR; + V_BSTR(&args[0]) = opt; + V_BSTR(&args[1]) = req; + VariantInit(&ret); + hr = ISpeechVoice_Invoke(speech_voice, dispid, &IID_NULL, 0, DISPATCH_METHOD, ¶ms, &ret, NULL, NULL); + ok(hr == S_OK, "got %#lx.\n", hr); + ok(V_VT(&ret) == VT_DISPATCH, "got %#x.\n", V_VT(&ret)); + hr = IDispatch_QueryInterface(V_DISPATCH(&ret), &IID_ISpeechObjectTokens, (void **)&speech_tokens); + ok(hr == S_OK, "got %#lx.\n", hr); + count = -1; + hr = ISpeechObjectTokens_get_Count(speech_tokens, &count); + ok(hr == S_OK, "got %#lx.\n", hr); + ok(count == 1, "got %ld.\n", count); + ISpeechObjectTokens_Release(speech_tokens); + VariantClear(&ret); + ISpeechVoice_Release(speech_voice);
done: diff --git a/dlls/sapi/tts.c b/dlls/sapi/tts.c index d08b0c5de22..d22ffd7a0da 100644 --- a/dlls/sapi/tts.c +++ b/dlls/sapi/tts.c @@ -213,10 +213,17 @@ static HRESULT WINAPI speech_voice_Invoke(ISpeechVoice *iface, DISPID dispid, RE WORD flags, DISPPARAMS *params, VARIANT *result, EXCEPINFO *excepinfo, UINT *argerr) { - FIXME("(%p, %ld, %s, %#lx, %#x, %p, %p, %p, %p): stub.\n", iface, dispid, debugstr_guid(riid), + ITypeInfo *typeinfo; + HRESULT hr; + + TRACE("(%p, %ld, %s, %#lx, %#x, %p, %p, %p, %p).\n", iface, dispid, debugstr_guid(riid), lcid, flags, params, result, excepinfo, argerr);
- return E_NOTIMPL; + if (FAILED(hr = get_typeinfo(ISpeechVoice_tid, &typeinfo))) + return hr; + hr = ITypeInfo_Invoke(typeinfo, iface, dispid, flags, params, result, excepinfo, argerr); + ITypeInfo_Release(typeinfo); + return hr; }
static HRESULT WINAPI speech_voice_get_Status(ISpeechVoice *iface, ISpeechVoiceStatus **status)
This merge request was approved by Huw Davies.