From: Robert Wilhelm robert.wilhelm@gmx.net
--- dlls/wshom.ocx/Makefile.in | 1 + dlls/wshom.ocx/network.c | 29 +++++++++++++++++++++++++++++ dlls/wshom.ocx/wshom_main.c | 13 +++++++++++++ dlls/wshom.ocx/wshom_private.h | 1 + 4 files changed, 44 insertions(+) create mode 100644 dlls/wshom.ocx/network.c
diff --git a/dlls/wshom.ocx/Makefile.in b/dlls/wshom.ocx/Makefile.in index 1264e9c96a5..27297eed2f0 100644 --- a/dlls/wshom.ocx/Makefile.in +++ b/dlls/wshom.ocx/Makefile.in @@ -4,6 +4,7 @@ IMPORTS = uuid oleaut32 ole32 shell32 user32 advapi32 scrrun EXTRADLLFLAGS = -Wb,--prefer-native
C_SRCS = \ + network.c \ shell.c \ wshom_main.c
diff --git a/dlls/wshom.ocx/network.c b/dlls/wshom.ocx/network.c new file mode 100644 index 00000000000..64b8551e6cc --- /dev/null +++ b/dlls/wshom.ocx/network.c @@ -0,0 +1,29 @@ +/* + * Copyright 2022 Robert Wilhelm + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "wshom_private.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(wshom); + +HRESULT WINAPI WshNetworkFactory_CreateInstance(IClassFactory *iface, IUnknown *outer, REFIID riid, void **ppv) +{ + FIXME("(%p %s %p)\n", outer, debugstr_guid(riid), ppv); + return E_NOINTERFACE; +} diff --git a/dlls/wshom.ocx/wshom_main.c b/dlls/wshom.ocx/wshom_main.c index b2dc79a1948..aed9f2dedf4 100644 --- a/dlls/wshom.ocx/wshom_main.c +++ b/dlls/wshom.ocx/wshom_main.c @@ -209,7 +209,16 @@ static const IClassFactoryVtbl WshShellFactoryVtbl = { ClassFactory_LockServer };
+static const IClassFactoryVtbl WshNetworkFactoryVtbl = { + ClassFactory_QueryInterface, + ClassFactory_AddRef, + ClassFactory_Release, + WshNetworkFactory_CreateInstance, + ClassFactory_LockServer +}; + static IClassFactory WshShellFactory = { &WshShellFactoryVtbl }; +static IClassFactory WshNetworkFactory = { &WshNetworkFactoryVtbl };
/****************************************************************** * DllMain (wshom.ocx.@) @@ -241,6 +250,10 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) TRACE("(CLSID_WshShell %s %p)\n", debugstr_guid(riid), ppv); return IClassFactory_QueryInterface(&WshShellFactory, riid, ppv); } + else if(IsEqualGUID(&CLSID_WshNetwork, rclsid)) { + TRACE("(CLSID_WshNetwork %s %p)\n", debugstr_guid(riid), ppv); + return IClassFactory_QueryInterface(&WshNetworkFactory, riid, ppv); + }
FIXME("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); return CLASS_E_CLASSNOTAVAILABLE; diff --git a/dlls/wshom.ocx/wshom_private.h b/dlls/wshom.ocx/wshom_private.h index a10cf2683a3..c2a66bf0610 100644 --- a/dlls/wshom.ocx/wshom_private.h +++ b/dlls/wshom.ocx/wshom_private.h @@ -47,3 +47,4 @@ struct provideclassinfo { extern void init_classinfo(const GUID *guid, IUnknown *outer, struct provideclassinfo *classinfo) DECLSPEC_HIDDEN;
HRESULT WINAPI WshShellFactory_CreateInstance(IClassFactory*,IUnknown*,REFIID,void**) DECLSPEC_HIDDEN; +HRESULT WINAPI WshNetworkFactory_CreateInstance(IClassFactory*,IUnknown*,REFIID,void**) DECLSPEC_HIDDEN;
From: Robert Wilhelm robert.wilhelm@gmx.net
--- dlls/wshom.ocx/network.c | 85 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 84 insertions(+), 1 deletion(-)
diff --git a/dlls/wshom.ocx/network.c b/dlls/wshom.ocx/network.c index 64b8551e6cc..8ac3f35ad41 100644 --- a/dlls/wshom.ocx/network.c +++ b/dlls/wshom.ocx/network.c @@ -17,13 +17,96 @@ */
#include "wshom_private.h" +#include "wshom.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(wshom);
+static HRESULT WINAPI WshNetwork2_QueryInterface(IWshNetwork2 *iface, REFIID riid, void **ppv) +{ + if(IsEqualGUID(riid, &IID_IUnknown)) { + TRACE("(IID_IUnknown %p)\n", ppv); + *ppv = iface; + }else if(IsEqualGUID(riid, &IID_IDispatch)) { + TRACE("(IID_IDispatch %p)\n", ppv); + *ppv = iface; + }else if(IsEqualGUID(riid, &IID_IWshNetwork2)) { + TRACE("(IID_IWshNetwork2 %p)\n", ppv); + *ppv = iface; + }else { + FIXME("Unknown iface %s\n", debugstr_guid(riid)); + *ppv = NULL; + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; +} + +static ULONG WINAPI WshNetwork2_AddRef(IWshNetwork2 *iface) +{ + TRACE("()\n"); + return 2; +} + +static ULONG WINAPI WshNetwork2_Release(IWshNetwork2 *iface) +{ + TRACE("()\n"); + return 2; +} + +static HRESULT WINAPI WshNetwork2_GetTypeInfoCount(IWshNetwork2 *iface, UINT *pctinfo) +{ + TRACE("(%p)\n", pctinfo); + + *pctinfo = 1; + return S_OK; +} + +static HRESULT WINAPI WshNetwork2_GetTypeInfo(IWshNetwork2 *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) +{ + FIXME("%p, %u, %lx, %p.\n", iface, iTInfo, lcid, ppTInfo); + return E_NOTIMPL; +} + +static HRESULT WINAPI WshNetwork2_GetIDsOfNames(IWshNetwork2 *iface, REFIID riid, LPOLESTR *rgszNames, + UINT cNames, LCID lcid, DISPID *rgDispId) +{ + FIXME("%p, %s, %p, %u, %lx, %p.\n", iface, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId); + return E_NOTIMPL; +} + +static HRESULT WINAPI WshNetwork2_Invoke(IWshNetwork2 *iface, DISPID dispIdMember, REFIID riid, LCID lcid, + WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + FIXME("%p, %ld, %s, %lx, %d, %p, %p, %p, %p.\n", iface, dispIdMember, debugstr_guid(riid), + lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); + return E_NOTIMPL; +} + +static HRESULT WINAPI WshNetwork2_get_UserDomain(IWshNetwork2 *iface, BSTR *UserDomain) +{ + FIXME("(%p)\n", UserDomain); + return E_NOTIMPL; +} + +static const IWshNetwork2Vtbl WshNetwork2Vtbl = { + WshNetwork2_QueryInterface, + WshNetwork2_AddRef, + WshNetwork2_Release, + WshNetwork2_GetTypeInfoCount, + WshNetwork2_GetTypeInfo, + WshNetwork2_GetIDsOfNames, + WshNetwork2_Invoke, + WshNetwork2_get_UserDomain, +}; + +static IWshNetwork2 WshNetwork2 = { &WshNetwork2Vtbl }; + HRESULT WINAPI WshNetworkFactory_CreateInstance(IClassFactory *iface, IUnknown *outer, REFIID riid, void **ppv) { FIXME("(%p %s %p)\n", outer, debugstr_guid(riid), ppv); - return E_NOINTERFACE; + + return IWshNetwork2_QueryInterface(&WshNetwork2, riid, ppv); }
From: Robert Wilhelm robert.wilhelm@gmx.net
--- dlls/wshom.ocx/tests/wshom.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)
diff --git a/dlls/wshom.ocx/tests/wshom.c b/dlls/wshom.ocx/tests/wshom.c index 34a02a8d1f9..f3b6ec77c51 100644 --- a/dlls/wshom.ocx/tests/wshom.c +++ b/dlls/wshom.ocx/tests/wshom.c @@ -673,6 +673,21 @@ static void test_popup(void) SysFreeString(text); IWshShell_Release(sh); } +static void test_wshnetwork(void) +{ + IDispatch *disp; + IUnknown *network; + HRESULT hr; + + hr = CoCreateInstance(&CLSID_WshNetwork, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, + &IID_IDispatch, (void**)&disp); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IDispatch_QueryInterface(disp, &IID_IWshNetwork2, (void**)&network); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + IUnknown_Release(network); +}
START_TEST(wshom) { @@ -693,6 +708,7 @@ START_TEST(wshom) test_wshshell(); test_registry(); test_popup(); + test_wshnetwork();
CoUninitialize(); }