From 23fe903d9aded30f4f94165c1a212969ff32af88 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Mon, 2 Jan 2012 15:09:52 +0300 Subject: [PATCH] wshom.ocx: Added IWshShortcut stub. --- dlls/wshom.ocx/shell.c | 285 ++++++++++++++++++++++++++++++++++++++++- dlls/wshom.ocx/tests/wshom.c | 17 ++- dlls/wshom.ocx/tests/wshom.idl | 62 +++++++++ dlls/wshom.ocx/wshom.idl | 62 +++++++++ dlls/wshom.ocx/wshom_main.c | 3 +- dlls/wshom.ocx/wshom_private.h | 1 + 6 files changed, 422 insertions(+), 8 deletions(-) diff --git a/dlls/wshom.ocx/shell.c b/dlls/wshom.ocx/shell.c index c2959e73c00..949707d4f17 100644 --- a/dlls/wshom.ocx/shell.c +++ b/dlls/wshom.ocx/shell.c @@ -66,11 +66,22 @@ typedef struct LONG ref; } WshCollection; +typedef struct +{ + IWshShortcut IWshShortcut_iface; + LONG ref; +} WshShortcut; + static inline WshCollection *impl_from_IWshCollection( IWshCollection *iface ) { return CONTAINING_RECORD(iface, WshCollection, IWshCollection_iface); } +static inline WshShortcut *impl_from_IWshShortcut( IWshShortcut *iface ) +{ + return CONTAINING_RECORD(iface, WshShortcut, IWshShortcut_iface); +} + static HRESULT WINAPI WshCollection_QueryInterface(IWshCollection *iface, REFIID riid, void **ppv) { WshCollection *This = impl_from_IWshCollection(iface); @@ -267,11 +278,277 @@ static HRESULT WshCollection_Create(IWshCollection **collection) return S_OK; } +/* IWshShortcut */ +static HRESULT WINAPI WshShortcut_QueryInterface(IWshShortcut *iface, REFIID riid, void **ppv) +{ + WshShortcut *This = impl_from_IWshShortcut(iface); + + TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), ppv); + + if (IsEqualGUID(riid, &IID_IUnknown) || + IsEqualGUID(riid, &IID_IDispatch) || + IsEqualGUID(riid, &IID_IWshShortcut)) + { + *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 WshShortcut_AddRef(IWshShortcut *iface) +{ + WshShortcut *This = impl_from_IWshShortcut(iface); + LONG ref = InterlockedIncrement(&This->ref); + TRACE("(%p) ref = %d\n", This, ref); + return ref; +} + +static ULONG WINAPI WshShortcut_Release(IWshShortcut *iface) +{ + WshShortcut *This = impl_from_IWshShortcut(iface); + LONG ref = InterlockedDecrement(&This->ref); + TRACE("(%p) ref = %d\n", This, ref); + + if (!ref) + HeapFree(GetProcessHeap(), 0, This); + + return ref; +} + +static HRESULT WINAPI WshShortcut_GetTypeInfoCount(IWshShortcut *iface, UINT *pctinfo) +{ + WshShortcut *This = impl_from_IWshShortcut(iface); + TRACE("(%p)->(%p)\n", This, pctinfo); + *pctinfo = 1; + return S_OK; +} + +static HRESULT WINAPI WshShortcut_GetTypeInfo(IWshShortcut *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) +{ + WshShortcut *This = impl_from_IWshShortcut(iface); + TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo); + return get_typeinfo(IWshShortcut_tid, ppTInfo); +} + +static HRESULT WINAPI WshShortcut_GetIDsOfNames(IWshShortcut *iface, REFIID riid, LPOLESTR *rgszNames, + UINT cNames, LCID lcid, DISPID *rgDispId) +{ + WshShortcut *This = impl_from_IWshShortcut(iface); + ITypeInfo *typeinfo; + HRESULT hr; + + TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId); + + hr = get_typeinfo(IWshShortcut_tid, &typeinfo); + if(SUCCEEDED(hr)) + { + hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId); + ITypeInfo_Release(typeinfo); + } + + return hr; +} + +static HRESULT WINAPI WshShortcut_Invoke(IWshShortcut *iface, DISPID dispIdMember, REFIID riid, LCID lcid, + WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + WshShortcut *This = impl_from_IWshShortcut(iface); + ITypeInfo *typeinfo; + HRESULT hr; + + TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid), + lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); + + hr = get_typeinfo(IWshShortcut_tid, &typeinfo); + if(SUCCEEDED(hr)) + { + hr = ITypeInfo_Invoke(typeinfo, &This->IWshShortcut_iface, dispIdMember, wFlags, + pDispParams, pVarResult, pExcepInfo, puArgErr); + ITypeInfo_Release(typeinfo); + } + + return hr; +} + +static HRESULT WINAPI WshShortcut_get_FullName(IWshShortcut *iface, BSTR *name) +{ + WshShortcut *This = impl_from_IWshShortcut(iface); + FIXME("(%p)->(%p): stub\n", This, name); + return E_NOTIMPL; +} + +static HRESULT WINAPI WshShortcut_get_Arguments(IWshShortcut *iface, BSTR *Arguments) +{ + WshShortcut *This = impl_from_IWshShortcut(iface); + FIXME("(%p)->(%p): stub\n", This, Arguments); + return E_NOTIMPL; +} + +static HRESULT WINAPI WshShortcut_put_Arguments(IWshShortcut *iface, BSTR Arguments) +{ + WshShortcut *This = impl_from_IWshShortcut(iface); + FIXME("(%p)->(%s): stub\n", This, debugstr_w(Arguments)); + return E_NOTIMPL; +} + +static HRESULT WINAPI WshShortcut_get_Description(IWshShortcut *iface, BSTR *Description) +{ + WshShortcut *This = impl_from_IWshShortcut(iface); + FIXME("(%p)->(%p): stub\n", This, Description); + return E_NOTIMPL; +} + +static HRESULT WINAPI WshShortcut_put_Description(IWshShortcut *iface, BSTR Description) +{ + WshShortcut *This = impl_from_IWshShortcut(iface); + FIXME("(%p)->(%s): stub\n", This, debugstr_w(Description)); + return E_NOTIMPL; +} + +static HRESULT WINAPI WshShortcut_get_Hotkey(IWshShortcut *iface, BSTR *Hotkey) +{ + WshShortcut *This = impl_from_IWshShortcut(iface); + FIXME("(%p)->(%p): stub\n", This, Hotkey); + return E_NOTIMPL; +} + +static HRESULT WINAPI WshShortcut_put_Hotkey(IWshShortcut *iface, BSTR Hotkey) +{ + WshShortcut *This = impl_from_IWshShortcut(iface); + FIXME("(%p)->(%s): stub\n", This, debugstr_w(Hotkey)); + return E_NOTIMPL; +} + +static HRESULT WINAPI WshShortcut_get_IconLocation(IWshShortcut *iface, BSTR *IconPath) +{ + WshShortcut *This = impl_from_IWshShortcut(iface); + FIXME("(%p)->(%p): stub\n", This, IconPath); + return E_NOTIMPL; +} + +static HRESULT WINAPI WshShortcut_put_IconLocation(IWshShortcut *iface, BSTR IconPath) +{ + WshShortcut *This = impl_from_IWshShortcut(iface); + FIXME("(%p)->(%s): stub\n", This, debugstr_w(IconPath)); + return E_NOTIMPL; +} + +static HRESULT WINAPI WshShortcut_put_RelativePath(IWshShortcut *iface, BSTR rhs) +{ + WshShortcut *This = impl_from_IWshShortcut(iface); + FIXME("(%p)->(%s): stub\n", This, debugstr_w(rhs)); + return E_NOTIMPL; +} + +static HRESULT WINAPI WshShortcut_get_TargetPath(IWshShortcut *iface, BSTR *Path) +{ + WshShortcut *This = impl_from_IWshShortcut(iface); + FIXME("(%p)->(%p): stub\n", This, Path); + return E_NOTIMPL; +} + +static HRESULT WINAPI WshShortcut_put_TargetPath(IWshShortcut *iface, BSTR Path) +{ + WshShortcut *This = impl_from_IWshShortcut(iface); + FIXME("(%p)->(%s): stub\n", This, debugstr_w(Path)); + return E_NOTIMPL; +} + +static HRESULT WINAPI WshShortcut_get_WindowStyle(IWshShortcut *iface, int *ShowCmd) +{ + WshShortcut *This = impl_from_IWshShortcut(iface); + FIXME("(%p)->(%p): stub\n", This, ShowCmd); + return E_NOTIMPL; +} + +static HRESULT WINAPI WshShortcut_put_WindowStyle(IWshShortcut *iface, int ShowCmd) +{ + WshShortcut *This = impl_from_IWshShortcut(iface); + FIXME("(%p)->(%d): stub\n", This, ShowCmd); + return E_NOTIMPL; +} + +static HRESULT WINAPI WshShortcut_get_WorkingDirectory(IWshShortcut *iface, BSTR *WorkingDirectory) +{ + WshShortcut *This = impl_from_IWshShortcut(iface); + FIXME("(%p)->(%p): stub\n", This, WorkingDirectory); + return E_NOTIMPL; +} + +static HRESULT WINAPI WshShortcut_put_WorkingDirectory(IWshShortcut *iface, BSTR WorkingDirectory) +{ + WshShortcut *This = impl_from_IWshShortcut(iface); + FIXME("(%p)->(%s): stub\n", This, debugstr_w(WorkingDirectory)); + return E_NOTIMPL; +} + +static HRESULT WINAPI WshShortcut_Load(IWshShortcut *iface, BSTR PathLink) +{ + WshShortcut *This = impl_from_IWshShortcut(iface); + FIXME("(%p)->(%s): stub\n", This, debugstr_w(PathLink)); + return E_NOTIMPL; +} + +static HRESULT WINAPI WshShortcut_Save(IWshShortcut *iface) +{ + WshShortcut *This = impl_from_IWshShortcut(iface); + FIXME("(%p): stub\n", This); + return E_NOTIMPL; +} + +static const IWshShortcutVtbl WshShortcutVtbl = { + WshShortcut_QueryInterface, + WshShortcut_AddRef, + WshShortcut_Release, + WshShortcut_GetTypeInfoCount, + WshShortcut_GetTypeInfo, + WshShortcut_GetIDsOfNames, + WshShortcut_Invoke, + WshShortcut_get_FullName, + WshShortcut_get_Arguments, + WshShortcut_put_Arguments, + WshShortcut_get_Description, + WshShortcut_put_Description, + WshShortcut_get_Hotkey, + WshShortcut_put_Hotkey, + WshShortcut_get_IconLocation, + WshShortcut_put_IconLocation, + WshShortcut_put_RelativePath, + WshShortcut_get_TargetPath, + WshShortcut_put_TargetPath, + WshShortcut_get_WindowStyle, + WshShortcut_put_WindowStyle, + WshShortcut_get_WorkingDirectory, + WshShortcut_put_WorkingDirectory, + WshShortcut_Load, + WshShortcut_Save +}; + +static HRESULT WshShortcut_Create(IDispatch **shortcut) +{ + WshShortcut *This; + + This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This)); + if (!This) return E_OUTOFMEMORY; + + This->IWshShortcut_iface.lpVtbl = &WshShortcutVtbl; + This->ref = 1; + + *shortcut = (IDispatch*)&This->IWshShortcut_iface; + + return S_OK; +} + static HRESULT WINAPI WshShell3_QueryInterface(IWshShell3 *iface, REFIID riid, void **ppv) { TRACE("(%s, %p)\n", debugstr_guid(riid), ppv); - if(IsEqualGUID(riid, &IID_IUnknown) || + if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IDispatch) || IsEqualGUID(riid, &IID_IWshShell3)) { @@ -374,10 +651,10 @@ static HRESULT WINAPI WshShell3_Popup(IWshShell3 *iface, BSTR Text, VARIANT* Sec return E_NOTIMPL; } -static HRESULT WINAPI WshShell3_CreateShortcut(IWshShell3 *iface, BSTR PathLink, IDispatch** out_Shortcut) +static HRESULT WINAPI WshShell3_CreateShortcut(IWshShell3 *iface, BSTR PathLink, IDispatch** Shortcut) { - FIXME("(%s %p): stub\n", debugstr_w(PathLink), out_Shortcut); - return E_NOTIMPL; + TRACE("(%s %p)\n", debugstr_w(PathLink), Shortcut); + return WshShortcut_Create(Shortcut); } static HRESULT WINAPI WshShell3_ExpandEnvironmentStrings(IWshShell3 *iface, BSTR Src, BSTR* out_Dst) diff --git a/dlls/wshom.ocx/tests/wshom.c b/dlls/wshom.ocx/tests/wshom.c index 2c2af459e03..c70696c66dd 100644 --- a/dlls/wshom.ocx/tests/wshom.c +++ b/dlls/wshom.ocx/tests/wshom.c @@ -34,11 +34,12 @@ DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); 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}; IWshShell3 *sh3; IDispatchEx *dispex; IWshCollection *coll; - IDispatch *disp; - IUnknown *shell; + IDispatch *disp, *shortcut; + IUnknown *shell, *unk; IFolderCollection *folders; ITypeInfo *ti; HRESULT hr; @@ -98,10 +99,20 @@ static void test_wshshell(void) V_VT(&res) = VT_EMPTY; hr = IWshCollection_Item(coll, &arg, &res); EXPECT_HR(hr, S_OK); - SysFreeString(str); ok(V_VT(&res) == VT_BSTR, "got res type %d\n", V_VT(&res)); + SysFreeString(str); VariantClear(&res); + /* CreateShortcut() */ + str = SysAllocString(lnk1W); + hr = IWshShell3_CreateShortcut(sh3, str, &shortcut); + EXPECT_HR(hr, S_OK); + SysFreeString(str); + hr = IDispatch_QueryInterface(shortcut, &IID_IWshShortcut, (void**)&unk); + EXPECT_HR(hr, S_OK); + IUnknown_Release(unk); + IDispatch_Release(shortcut); + IWshCollection_Release(coll); IDispatch_Release(disp); IWshShell3_Release(sh3); diff --git a/dlls/wshom.ocx/tests/wshom.idl b/dlls/wshom.ocx/tests/wshom.idl index cdd63632dbb..a89b3fcb8aa 100644 --- a/dlls/wshom.ocx/tests/wshom.idl +++ b/dlls/wshom.ocx/tests/wshom.idl @@ -444,6 +444,68 @@ library IWshRuntimeLibrary }; [ + uuid(f935dc23-1cf0-11d0-adb9-00c04fd58a0b), + odl, + dual, + oleautomation + ] + interface IWshShortcut : IDispatch { + [id(DISPID_VALUE), propget] + HRESULT FullName([out, retval] BSTR* name); + + [id(0x03e8), propget] + HRESULT Arguments([out, retval] BSTR* Arguments); + + [id(0x03e8), propput] + HRESULT Arguments([in] BSTR Arguments); + + [id(0x03e9), propget] + HRESULT Description([out, retval] BSTR* Description); + + [id(0x03e9), propput] + HRESULT Description([in] BSTR Description); + + [id(0x03ea), propget] + HRESULT Hotkey([out, retval] BSTR* HotKey); + + [id(0x03ea), propput] + HRESULT Hotkey([in] BSTR HotKey); + + [id(0x03eb), propget] + HRESULT IconLocation([out, retval] BSTR* IconPath); + + [id(0x03eb), propput] + HRESULT IconLocation([in] BSTR IconPath); + + [id(0x03ec), propput] + HRESULT RelativePath([in] BSTR rhs); + + [id(0x03ed), propget] + HRESULT TargetPath([out, retval] BSTR* Path); + + [id(0x03ed), propput] + HRESULT TargetPath([in] BSTR Path); + + [id(0x03ee), propget] + HRESULT WindowStyle([out, retval] int* ShowCmd); + + [id(0x03ee), propput] + HRESULT WindowStyle([in] int ShowCmd); + + [id(0x03ef), propget] + HRESULT WorkingDirectory([out, retval] BSTR* WorkingDirectory); + + [id(0x03ef), propput] + HRESULT WorkingDirectory([in] BSTR WorkingDirectory); + + [id(0x07d0), hidden] + HRESULT Load([in] BSTR PathLink); + + [id(0x07d1)] + HRESULT Save(); + }; + + [ uuid(f935dc21-1cf0-11d0-adb9-00c04fd58a0b), odl, dual, diff --git a/dlls/wshom.ocx/wshom.idl b/dlls/wshom.ocx/wshom.idl index cdd63632dbb..a89b3fcb8aa 100644 --- a/dlls/wshom.ocx/wshom.idl +++ b/dlls/wshom.ocx/wshom.idl @@ -444,6 +444,68 @@ library IWshRuntimeLibrary }; [ + uuid(f935dc23-1cf0-11d0-adb9-00c04fd58a0b), + odl, + dual, + oleautomation + ] + interface IWshShortcut : IDispatch { + [id(DISPID_VALUE), propget] + HRESULT FullName([out, retval] BSTR* name); + + [id(0x03e8), propget] + HRESULT Arguments([out, retval] BSTR* Arguments); + + [id(0x03e8), propput] + HRESULT Arguments([in] BSTR Arguments); + + [id(0x03e9), propget] + HRESULT Description([out, retval] BSTR* Description); + + [id(0x03e9), propput] + HRESULT Description([in] BSTR Description); + + [id(0x03ea), propget] + HRESULT Hotkey([out, retval] BSTR* HotKey); + + [id(0x03ea), propput] + HRESULT Hotkey([in] BSTR HotKey); + + [id(0x03eb), propget] + HRESULT IconLocation([out, retval] BSTR* IconPath); + + [id(0x03eb), propput] + HRESULT IconLocation([in] BSTR IconPath); + + [id(0x03ec), propput] + HRESULT RelativePath([in] BSTR rhs); + + [id(0x03ed), propget] + HRESULT TargetPath([out, retval] BSTR* Path); + + [id(0x03ed), propput] + HRESULT TargetPath([in] BSTR Path); + + [id(0x03ee), propget] + HRESULT WindowStyle([out, retval] int* ShowCmd); + + [id(0x03ee), propput] + HRESULT WindowStyle([in] int ShowCmd); + + [id(0x03ef), propget] + HRESULT WorkingDirectory([out, retval] BSTR* WorkingDirectory); + + [id(0x03ef), propput] + HRESULT WorkingDirectory([in] BSTR WorkingDirectory); + + [id(0x07d0), hidden] + HRESULT Load([in] BSTR PathLink); + + [id(0x07d1)] + HRESULT Save(); + }; + + [ uuid(f935dc21-1cf0-11d0-adb9-00c04fd58a0b), odl, dual, diff --git a/dlls/wshom.ocx/wshom_main.c b/dlls/wshom.ocx/wshom_main.c index c76b815da07..6493d86129d 100644 --- a/dlls/wshom.ocx/wshom_main.c +++ b/dlls/wshom.ocx/wshom_main.c @@ -34,7 +34,8 @@ static ITypeInfo *typeinfos[LAST_tid]; static REFIID tid_ids[] = { &IID_NULL, &IID_IWshShell3, - &IID_IWshCollection + &IID_IWshCollection, + &IID_IWshShortcut }; static HRESULT load_typelib(void) diff --git a/dlls/wshom.ocx/wshom_private.h b/dlls/wshom.ocx/wshom_private.h index 1b340ca483b..b39299f1735 100644 --- a/dlls/wshom.ocx/wshom_private.h +++ b/dlls/wshom.ocx/wshom_private.h @@ -29,6 +29,7 @@ typedef enum tid_t { NULL_tid, IWshShell3_tid, IWshCollection_tid, + IWshShortcut_tid, LAST_tid } tid_t; -- 2.11.4.GIT