From: Nikolay Sivov Subject: wshom.ocx: Implement get_Item() for IWshEnvironment Message-Id: <53CE751A.4010403@codeweavers.com> Date: Tue, 22 Jul 2014 18:28:42 +0400 --- From b11bb3184713d6b1cd64654b5026c209d47c9a19 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Tue, 22 Jul 2014 18:26:10 +0400 Subject: [PATCH] wshom.ocx: Implement get_Item() for IWshEnvironment --- dlls/wshom.ocx/shell.c | 18 ++++++++++++++++-- dlls/wshom.ocx/tests/wshom.c | 42 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 57 insertions(+), 3 deletions(-) diff --git a/dlls/wshom.ocx/shell.c b/dlls/wshom.ocx/shell.c index 09b3fa0..b7b819a 100644 --- a/dlls/wshom.ocx/shell.c +++ b/dlls/wshom.ocx/shell.c @@ -197,8 +197,22 @@ static HRESULT WINAPI WshEnvironment_Invoke(IWshEnvironment *iface, DISPID dispI static HRESULT WINAPI WshEnvironment_get_Item(IWshEnvironment *iface, BSTR name, BSTR *value) { WshEnvironment *This = impl_from_IWshEnvironment(iface); - FIXME("(%p)->(%s %p): stub\n", This, debugstr_w(name), value); - return E_NOTIMPL; + DWORD len; + + TRACE("(%p)->(%s %p)\n", This, debugstr_w(name), value); + + if (!value) + return E_POINTER; + + len = GetEnvironmentVariableW(name, NULL, 0); + *value = SysAllocStringLen(NULL, len); + if (!*value) + return E_OUTOFMEMORY; + + if (len) + GetEnvironmentVariableW(name, *value, len+1); + + return S_OK; } static HRESULT WINAPI WshEnvironment_put_Item(IWshEnvironment *iface, BSTR name, BSTR value) diff --git a/dlls/wshom.ocx/tests/wshom.c b/dlls/wshom.ocx/tests/wshom.c index 5f6e79d..4c3581e 100644 --- a/dlls/wshom.ocx/tests/wshom.c +++ b/dlls/wshom.ocx/tests/wshom.c @@ -36,6 +36,9 @@ static void test_wshshell(void) static const WCHAR desktopW[] = {'D','e','s','k','t','o','p',0}; static const WCHAR lnk1W[] = {'f','i','l','e','.','l','n','k',0}; static const WCHAR pathW[] = {'%','P','A','T','H','%',0}; + static const WCHAR sysW[] = {'S','Y','S','T','E','M',0}; + static const WCHAR path2W[] = {'P','A','T','H',0}; + IWshEnvironment *env; IWshShell3 *sh3; IDispatchEx *dispex; IWshCollection *coll; @@ -49,7 +52,7 @@ static void test_wshshell(void) DISPPARAMS dp; EXCEPINFO ei; VARIANT arg, res; - BSTR str; + BSTR str, ret; UINT err; hr = CoCreateInstance(&CLSID_WshShell, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, @@ -131,6 +134,43 @@ static void test_wshshell(void) ok(hr == E_POINTER, "got 0x%08x\n", hr); SysFreeString(str); + V_VT(&arg) = VT_BSTR; + V_BSTR(&arg) = SysAllocString(sysW); + hr = IWshShell3_get_Environment(sh3, &arg, &env); + ok(hr == S_OK, "got 0x%08x\n", hr); + VariantClear(&arg); + + hr = IWshEnvironment_get_Item(env, NULL, NULL); + ok(hr == E_POINTER, "got 0x%08x\n", hr); + + ret = (BSTR)0x1; + hr = IWshEnvironment_get_Item(env, NULL, &ret); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(ret && !*ret, "got %p\n", ret); + SysFreeString(ret); + + /* invalid var name */ + str = SysAllocString(lnk1W); + hr = IWshEnvironment_get_Item(env, str, NULL); + ok(hr == E_POINTER, "got 0x%08x\n", hr); + + ret = NULL; + hr = IWshEnvironment_get_Item(env, str, &ret); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(ret && *ret == 0, "got %s\n", wine_dbgstr_w(ret)); + SysFreeString(ret); + SysFreeString(str); + + /* valid name */ + str = SysAllocString(path2W); + hr = IWshEnvironment_get_Item(env, str, &ret); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(ret && *ret != 0, "got %s\n", wine_dbgstr_w(ret)); + SysFreeString(ret); + SysFreeString(str); + + IWshEnvironment_Release(env); + IWshCollection_Release(coll); IDispatch_Release(disp); IWshShell3_Release(sh3); -- 2.0.1