From e58bd59277dbe36c2f0344f6406113a4ae47265e Mon Sep 17 00:00:00 2001 From: Alistair Leslie-Hughes Date: Wed, 22 Sep 2021 19:01:44 +1000 Subject: [PATCH] sapi: Implement ISpRegDataKey GetStringValue. --- dlls/sapi/tests/token.c | 10 ++++++++++ dlls/sapi/token.c | 29 +++++++++++++++++++++++++++-- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/dlls/sapi/tests/token.c b/dlls/sapi/tests/token.c index 63f5c651a50..7778f4e61db 100644 --- a/dlls/sapi/tests/token.c +++ b/dlls/sapi/tests/token.c @@ -33,6 +33,7 @@ static void test_data_key(void) HRESULT hr; HKEY key; LONG res; + WCHAR *value; hr = CoCreateInstance( &CLSID_SpDataKey, NULL, CLSCTX_INPROC_SERVER, &IID_ISpRegDataKey, (void **)&data_key ); @@ -45,11 +46,20 @@ static void test_data_key(void) hr = ISpRegDataKey_CreateKey( data_key, L"Testing", &sub ); ok( hr == E_HANDLE, "got %08lx\n", hr ); + hr = ISpRegDataKey_GetStringValue( data_key, L"Voice", &value ); + ok( hr == E_HANDLE, "got %08lx\n", hr ); + hr = ISpRegDataKey_SetKey( data_key, key, FALSE ); ok( hr == S_OK, "got %08lx\n", hr ); hr = ISpRegDataKey_SetKey( data_key, key, FALSE ); ok( hr == SPERR_ALREADY_INITIALIZED, "got %08lx\n", hr ); + hr = ISpRegDataKey_GetStringValue( data_key, L"Voice", &value ); + ok( hr == SPERR_NOT_FOUND, "got %08lx\n", hr ); + + hr = ISpRegDataKey_GetStringValue( data_key, L"", &value ); + ok( hr == SPERR_NOT_FOUND, "got %08lx\n", hr ); + hr = ISpRegDataKey_CreateKey( data_key, L"Testing", &sub ); ok( hr == S_OK, "got %08lx\n", hr ); ISpDataKey_Release(sub); diff --git a/dlls/sapi/token.c b/dlls/sapi/token.c index 133d27a2a66..b5cfc45e5a3 100644 --- a/dlls/sapi/token.c +++ b/dlls/sapi/token.c @@ -117,8 +117,33 @@ static HRESULT WINAPI data_key_SetStringValue( ISpRegDataKey *iface, static HRESULT WINAPI data_key_GetStringValue( ISpRegDataKey *iface, LPCWSTR name, LPWSTR *value ) { - FIXME( "stub\n" ); - return E_NOTIMPL; + struct data_key *This = impl_from_ISpRegDataKey( iface ); + DWORD ret, size; + WCHAR *content; + + TRACE( "%p, %s, %p\n", This, debugstr_w(name), value); + + if (!This->key) + return E_HANDLE; + + size = 0; + ret = RegGetValueW( This->key, NULL, name, RRF_RT_REG_SZ, NULL, NULL, &size ); + if (ret != ERROR_SUCCESS) + return SPERR_NOT_FOUND; + + content = CoTaskMemAlloc(size); + if (!content) + return E_OUTOFMEMORY; + + ret = RegGetValueW( This->key, NULL, name, RRF_RT_REG_SZ, NULL, content, &size ); + if (ret != ERROR_SUCCESS) + { + CoTaskMemFree(content); + return HRESULT_FROM_WIN32(ret); + } + + *value = content; + return S_OK; } static HRESULT WINAPI data_key_SetDWORD( ISpRegDataKey *iface, -- 2.11.4.GIT