2 * IShellDispatch implementation
4 * Copyright 2010 Alexander Morozov for Etersoft
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 #include "wine/port.h"
37 #include "shell32_main.h"
39 #include "wine/debug.h"
41 WINE_DEFAULT_DEBUG_CHANNEL(shell
);
43 static ITypeLib
*typelib
;
44 static const IID
* const tid_ids
[] =
48 &IID_IShellFolderViewDual3
,
55 static ITypeInfo
*typeinfos
[LAST_tid
];
58 IShellDispatch6 IShellDispatch6_iface
;
63 Folder3 Folder3_iface
;
69 FolderItems3 FolderItems3_iface
;
74 FolderItem2 FolderItem2_iface
;
80 FolderItemVerbs FolderItemVerbs_iface
;
83 IContextMenu
*contextmenu
;
86 } FolderItemVerbsImpl
;
89 FolderItemVerb FolderItemVerb_iface
;
92 IContextMenu
*contextmenu
;
96 static inline ShellDispatch
*impl_from_IShellDispatch6(IShellDispatch6
*iface
)
98 return CONTAINING_RECORD(iface
, ShellDispatch
, IShellDispatch6_iface
);
101 static inline FolderImpl
*impl_from_Folder(Folder3
*iface
)
103 return CONTAINING_RECORD(iface
, FolderImpl
, Folder3_iface
);
106 static inline FolderItemsImpl
*impl_from_FolderItems(FolderItems3
*iface
)
108 return CONTAINING_RECORD(iface
, FolderItemsImpl
, FolderItems3_iface
);
111 static inline FolderItemImpl
*impl_from_FolderItem(FolderItem2
*iface
)
113 return CONTAINING_RECORD(iface
, FolderItemImpl
, FolderItem2_iface
);
116 static inline FolderItemVerbsImpl
*impl_from_FolderItemVerbs(FolderItemVerbs
*iface
)
118 return CONTAINING_RECORD(iface
, FolderItemVerbsImpl
, FolderItemVerbs_iface
);
121 static inline FolderItemVerbImpl
*impl_from_FolderItemVerb(FolderItemVerb
*iface
)
123 return CONTAINING_RECORD(iface
, FolderItemVerbImpl
, FolderItemVerb_iface
);
126 static HRESULT
load_typelib(void)
131 hr
= LoadRegTypeLib(&LIBID_Shell32
, 1, 0, LOCALE_SYSTEM_DEFAULT
, &tl
);
133 ERR("LoadRegTypeLib failed: %08x\n", hr
);
137 if (InterlockedCompareExchangePointer((void**)&typelib
, tl
, NULL
))
138 ITypeLib_Release(tl
);
142 void release_typelib(void)
149 for (i
= 0; i
< sizeof(typeinfos
)/sizeof(*typeinfos
); i
++)
151 ITypeInfo_Release(typeinfos
[i
]);
153 ITypeLib_Release(typelib
);
156 HRESULT
get_typeinfo(enum tid_t tid
, ITypeInfo
**typeinfo
)
169 hr
= ITypeLib_GetTypeInfoOfGuid(typelib
, tid_ids
[tid
], &ti
);
172 ERR("GetTypeInfoOfGuid(%s) failed: %08x\n", debugstr_guid(tid_ids
[tid
]), hr
);
176 if (InterlockedCompareExchangePointer((void**)(typeinfos
+tid
), ti
, NULL
))
177 ITypeInfo_Release(ti
);
180 *typeinfo
= typeinfos
[tid
];
185 static HRESULT WINAPI
FolderItemVerbImpl_QueryInterface(FolderItemVerb
*iface
,
186 REFIID riid
, void **ppv
)
188 FolderItemVerbImpl
*This
= impl_from_FolderItemVerb(iface
);
190 TRACE("(%p,%s,%p)\n", iface
, shdebugstr_guid(riid
), ppv
);
194 if (IsEqualIID(&IID_IUnknown
, riid
) ||
195 IsEqualIID(&IID_IDispatch
, riid
) ||
196 IsEqualIID(&IID_FolderItemVerb
, riid
))
197 *ppv
= &This
->FolderItemVerb_iface
;
200 FIXME("not implemented for %s\n", shdebugstr_guid(riid
));
202 return E_NOINTERFACE
;
205 IUnknown_AddRef((IUnknown
*)*ppv
);
209 static ULONG WINAPI
FolderItemVerbImpl_AddRef(FolderItemVerb
*iface
)
211 FolderItemVerbImpl
*This
= impl_from_FolderItemVerb(iface
);
212 ULONG ref
= InterlockedIncrement(&This
->ref
);
214 TRACE("(%p), new refcount=%i\n", iface
, ref
);
219 static ULONG WINAPI
FolderItemVerbImpl_Release(FolderItemVerb
*iface
)
221 FolderItemVerbImpl
*This
= impl_from_FolderItemVerb(iface
);
222 ULONG ref
= InterlockedDecrement(&This
->ref
);
224 TRACE("(%p), new refcount=%i\n", iface
, ref
);
228 IContextMenu_Release(This
->contextmenu
);
229 SysFreeString(This
->name
);
230 HeapFree(GetProcessHeap(), 0, This
);
236 static HRESULT WINAPI
FolderItemVerbImpl_GetTypeInfoCount(FolderItemVerb
*iface
, UINT
*pctinfo
)
238 TRACE("(%p,%p)\n", iface
, pctinfo
);
243 static HRESULT WINAPI
FolderItemVerbImpl_GetTypeInfo(FolderItemVerb
*iface
, UINT iTInfo
,
244 LCID lcid
, ITypeInfo
**ppTInfo
)
248 TRACE("(%p,%u,%d,%p)\n", iface
, iTInfo
, lcid
, ppTInfo
);
250 hr
= get_typeinfo(FolderItemVerb_tid
, ppTInfo
);
252 ITypeInfo_AddRef(*ppTInfo
);
256 static HRESULT WINAPI
FolderItemVerbImpl_GetIDsOfNames(FolderItemVerb
*iface
,
257 REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
262 TRACE("(%p,%s,%p,%u,%d,%p)\n", iface
, shdebugstr_guid(riid
), rgszNames
, cNames
, lcid
,
265 hr
= get_typeinfo(FolderItemVerb_tid
, &ti
);
267 hr
= ITypeInfo_GetIDsOfNames(ti
, rgszNames
, cNames
, rgDispId
);
271 static HRESULT WINAPI
FolderItemVerbImpl_Invoke(FolderItemVerb
*iface
,
272 DISPID dispIdMember
, REFIID riid
, LCID lcid
, WORD wFlags
,
273 DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
,
279 TRACE("(%p,%d,%s,%d,%u,%p,%p,%p,%p)\n", iface
, dispIdMember
, shdebugstr_guid(riid
), lcid
,
280 wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
282 hr
= get_typeinfo(FolderItemVerb_tid
, &ti
);
284 hr
= ITypeInfo_Invoke(ti
, iface
, dispIdMember
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
288 static HRESULT WINAPI
FolderItemVerbImpl_get_Application(FolderItemVerb
*iface
, IDispatch
**disp
)
290 FIXME("(%p, %p)\n", iface
, disp
);
294 static HRESULT WINAPI
FolderItemVerbImpl_get_Parent(FolderItemVerb
*iface
, IDispatch
**disp
)
296 FIXME("(%p, %p)\n", iface
, disp
);
300 static HRESULT WINAPI
FolderItemVerbImpl_get_Name(FolderItemVerb
*iface
, BSTR
*name
)
302 FolderItemVerbImpl
*This
= impl_from_FolderItemVerb(iface
);
304 TRACE("(%p, %p)\n", iface
, name
);
306 *name
= SysAllocString(This
->name
);
307 return *name
? S_OK
: E_OUTOFMEMORY
;
310 static HRESULT WINAPI
FolderItemVerbImpl_DoIt(FolderItemVerb
*iface
)
312 FIXME("(%p)\n", iface
);
316 static FolderItemVerbVtbl folderitemverbvtbl
= {
317 FolderItemVerbImpl_QueryInterface
,
318 FolderItemVerbImpl_AddRef
,
319 FolderItemVerbImpl_Release
,
320 FolderItemVerbImpl_GetTypeInfoCount
,
321 FolderItemVerbImpl_GetTypeInfo
,
322 FolderItemVerbImpl_GetIDsOfNames
,
323 FolderItemVerbImpl_Invoke
,
324 FolderItemVerbImpl_get_Application
,
325 FolderItemVerbImpl_get_Parent
,
326 FolderItemVerbImpl_get_Name
,
327 FolderItemVerbImpl_DoIt
330 static HRESULT
FolderItemVerb_Constructor(IContextMenu
*contextmenu
, BSTR name
, FolderItemVerb
**verb
)
332 FolderItemVerbImpl
*This
;
334 TRACE("%p, %s\n", contextmenu
, debugstr_w(name
));
336 This
= HeapAlloc(GetProcessHeap(), 0, sizeof(FolderItemVerbImpl
));
338 return E_OUTOFMEMORY
;
340 This
->FolderItemVerb_iface
.lpVtbl
= &folderitemverbvtbl
;
342 This
->contextmenu
= contextmenu
;
343 IContextMenu_AddRef(contextmenu
);
346 *verb
= &This
->FolderItemVerb_iface
;
350 /* FolderItemVerbs */
351 static HRESULT WINAPI
FolderItemVerbsImpl_QueryInterface(FolderItemVerbs
*iface
,
352 REFIID riid
, void **ppv
)
354 FolderItemVerbsImpl
*This
= impl_from_FolderItemVerbs(iface
);
356 TRACE("(%p,%s,%p)\n", iface
, shdebugstr_guid(riid
), ppv
);
360 if (IsEqualIID(&IID_IUnknown
, riid
) ||
361 IsEqualIID(&IID_IDispatch
, riid
) ||
362 IsEqualIID(&IID_FolderItemVerbs
, riid
))
363 *ppv
= &This
->FolderItemVerbs_iface
;
366 FIXME("not implemented for %s\n", shdebugstr_guid(riid
));
368 return E_NOINTERFACE
;
371 IUnknown_AddRef((IUnknown
*)*ppv
);
375 static ULONG WINAPI
FolderItemVerbsImpl_AddRef(FolderItemVerbs
*iface
)
377 FolderItemVerbsImpl
*This
= impl_from_FolderItemVerbs(iface
);
378 ULONG ref
= InterlockedIncrement(&This
->ref
);
380 TRACE("(%p), new refcount=%i\n", iface
, ref
);
385 static ULONG WINAPI
FolderItemVerbsImpl_Release(FolderItemVerbs
*iface
)
387 FolderItemVerbsImpl
*This
= impl_from_FolderItemVerbs(iface
);
388 ULONG ref
= InterlockedDecrement(&This
->ref
);
390 TRACE("(%p), new refcount=%i\n", iface
, ref
);
394 IContextMenu_Release(This
->contextmenu
);
395 DestroyMenu(This
->hMenu
);
396 HeapFree(GetProcessHeap(), 0, This
);
402 static HRESULT WINAPI
FolderItemVerbsImpl_GetTypeInfoCount(FolderItemVerbs
*iface
, UINT
*pctinfo
)
404 TRACE("(%p,%p)\n", iface
, pctinfo
);
409 static HRESULT WINAPI
FolderItemVerbsImpl_GetTypeInfo(FolderItemVerbs
*iface
, UINT iTInfo
,
410 LCID lcid
, ITypeInfo
**ppTInfo
)
414 TRACE("(%p,%u,%d,%p)\n", iface
, iTInfo
, lcid
, ppTInfo
);
416 hr
= get_typeinfo(FolderItemVerbs_tid
, ppTInfo
);
418 ITypeInfo_AddRef(*ppTInfo
);
422 static HRESULT WINAPI
FolderItemVerbsImpl_GetIDsOfNames(FolderItemVerbs
*iface
,
423 REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
428 TRACE("(%p,%s,%p,%u,%d,%p)\n", iface
, shdebugstr_guid(riid
), rgszNames
, cNames
, lcid
,
431 hr
= get_typeinfo(FolderItemVerbs_tid
, &ti
);
433 hr
= ITypeInfo_GetIDsOfNames(ti
, rgszNames
, cNames
, rgDispId
);
437 static HRESULT WINAPI
FolderItemVerbsImpl_Invoke(FolderItemVerbs
*iface
,
438 DISPID dispIdMember
, REFIID riid
, LCID lcid
, WORD wFlags
,
439 DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
,
445 TRACE("(%p,%d,%s,%d,%u,%p,%p,%p,%p)\n", iface
, dispIdMember
, shdebugstr_guid(riid
), lcid
,
446 wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
448 hr
= get_typeinfo(FolderItemVerbs_tid
, &ti
);
450 hr
= ITypeInfo_Invoke(ti
, iface
, dispIdMember
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
454 static HRESULT WINAPI
FolderItemVerbsImpl_get_Count(FolderItemVerbs
*iface
, LONG
*count
)
456 FolderItemVerbsImpl
*This
= impl_from_FolderItemVerbs(iface
);
458 TRACE("(%p, %p)\n", iface
, count
);
463 *count
= This
->count
;
467 static HRESULT WINAPI
FolderItemVerbsImpl_get_Application(FolderItemVerbs
*iface
, IDispatch
**disp
)
469 FIXME("(%p, %p)\n", iface
, disp
);
473 static HRESULT WINAPI
FolderItemVerbsImpl_get_Parent(FolderItemVerbs
*iface
, IDispatch
**disp
)
475 FIXME("(%p, %p)\n", iface
, disp
);
479 static HRESULT WINAPI
FolderItemVerbsImpl_Item(FolderItemVerbs
*iface
, VARIANT index
, FolderItemVerb
**verb
)
481 FolderItemVerbsImpl
*This
= impl_from_FolderItemVerbs(iface
);
487 TRACE("(%p, %s, %p)\n", iface
, debugstr_variant(&index
), verb
);
495 VariantCopyInd(&v
, &index
);
497 hr
= VariantChangeType(&v
, &v
, 0, VT_I4
);
500 FIXME("failed to coerce to VT_I4, %s\n", debugstr_variant(&v
));
504 if (V_I4(&v
) > This
->count
)
507 if (V_I4(&v
) == This
->count
)
508 name
= SysAllocStringLen(NULL
, 0);
512 memset(&info
, 0, sizeof(info
));
513 info
.cbSize
= sizeof(info
);
514 info
.fMask
= MIIM_STRING
;
515 if (!GetMenuItemInfoW(This
->hMenu
, V_I4(&v
), TRUE
, &info
))
518 name
= SysAllocStringLen(NULL
, info
.cch
);
521 info
.dwTypeData
= name
;
523 GetMenuItemInfoW(This
->hMenu
, V_I4(&v
), TRUE
, &info
);
528 return E_OUTOFMEMORY
;
530 return FolderItemVerb_Constructor(This
->contextmenu
, name
, verb
);
533 static HRESULT WINAPI
FolderItemVerbsImpl__NewEnum(FolderItemVerbs
*iface
, IUnknown
**ret
)
535 FIXME("(%p, %p)\n", iface
, ret
);
539 static FolderItemVerbsVtbl folderitemverbsvtbl
= {
540 FolderItemVerbsImpl_QueryInterface
,
541 FolderItemVerbsImpl_AddRef
,
542 FolderItemVerbsImpl_Release
,
543 FolderItemVerbsImpl_GetTypeInfoCount
,
544 FolderItemVerbsImpl_GetTypeInfo
,
545 FolderItemVerbsImpl_GetIDsOfNames
,
546 FolderItemVerbsImpl_Invoke
,
547 FolderItemVerbsImpl_get_Count
,
548 FolderItemVerbsImpl_get_Application
,
549 FolderItemVerbsImpl_get_Parent
,
550 FolderItemVerbsImpl_Item
,
551 FolderItemVerbsImpl__NewEnum
554 static HRESULT
FolderItemVerbs_Constructor(BSTR path
, FolderItemVerbs
**verbs
)
556 FolderItemVerbsImpl
*This
;
557 IShellFolder
*folder
;
562 This
= HeapAlloc(GetProcessHeap(), 0, sizeof(FolderItemVerbsImpl
));
564 return E_OUTOFMEMORY
;
566 This
->FolderItemVerbs_iface
.lpVtbl
= &folderitemverbsvtbl
;
569 /* build context menu for this path */
570 hr
= SHParseDisplayName(path
, NULL
, &pidl
, 0, NULL
);
574 hr
= SHBindToParent(pidl
, &IID_IShellFolder
, (void**)&folder
, &child
);
579 hr
= IShellFolder_GetUIObjectOf(folder
, NULL
, 1, &child
, &IID_IContextMenu
, NULL
, (void**)&This
->contextmenu
);
580 IShellFolder_Release(folder
);
584 This
->hMenu
= CreatePopupMenu();
585 hr
= IContextMenu_QueryContextMenu(This
->contextmenu
, This
->hMenu
, 0, FCIDM_SHVIEWFIRST
, FCIDM_SHVIEWLAST
, CMF_NORMAL
);
588 FolderItemVerbs_Release(&This
->FolderItemVerbs_iface
);
592 This
->count
= GetMenuItemCount(This
->hMenu
);
593 *verbs
= &This
->FolderItemVerbs_iface
;
597 HeapFree(GetProcessHeap(), 0, This
);
601 static HRESULT WINAPI
FolderItemImpl_QueryInterface(FolderItem2
*iface
,
602 REFIID riid
, LPVOID
*ppv
)
604 FolderItemImpl
*This
= impl_from_FolderItem(iface
);
606 TRACE("(%p,%s,%p)\n", iface
, shdebugstr_guid(riid
), ppv
);
608 if (!ppv
) return E_INVALIDARG
;
610 if (IsEqualIID(&IID_IUnknown
, riid
) ||
611 IsEqualIID(&IID_IDispatch
, riid
) ||
612 IsEqualIID(&IID_FolderItem
, riid
) ||
613 IsEqualIID(&IID_FolderItem2
, riid
))
614 *ppv
= &This
->FolderItem2_iface
;
617 FIXME("not implemented for %s\n", shdebugstr_guid(riid
));
619 return E_NOINTERFACE
;
621 IUnknown_AddRef((IUnknown
*)*ppv
);
625 static ULONG WINAPI
FolderItemImpl_AddRef(FolderItem2
*iface
)
627 FolderItemImpl
*This
= impl_from_FolderItem(iface
);
628 ULONG ref
= InterlockedIncrement(&This
->ref
);
630 TRACE("(%p), new refcount=%i\n", iface
, ref
);
635 static ULONG WINAPI
FolderItemImpl_Release(FolderItem2
*iface
)
637 FolderItemImpl
*This
= impl_from_FolderItem(iface
);
638 ULONG ref
= InterlockedDecrement(&This
->ref
);
640 TRACE("(%p), new refcount=%i\n", iface
, ref
);
644 VariantClear(&This
->dir
);
645 HeapFree(GetProcessHeap(), 0, This
);
650 static HRESULT WINAPI
FolderItemImpl_GetTypeInfoCount(FolderItem2
*iface
,
653 TRACE("(%p,%p)\n", iface
, pctinfo
);
659 static HRESULT WINAPI
FolderItemImpl_GetTypeInfo(FolderItem2
*iface
, UINT iTInfo
,
660 LCID lcid
, ITypeInfo
**ppTInfo
)
664 TRACE("(%p,%u,%d,%p)\n", iface
, iTInfo
, lcid
, ppTInfo
);
666 hr
= get_typeinfo(FolderItem2_tid
, ppTInfo
);
668 ITypeInfo_AddRef(*ppTInfo
);
672 static HRESULT WINAPI
FolderItemImpl_GetIDsOfNames(FolderItem2
*iface
,
673 REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
,
679 TRACE("(%p,%s,%p,%u,%d,%p)\n", iface
, shdebugstr_guid(riid
), rgszNames
, cNames
, lcid
,
682 hr
= get_typeinfo(FolderItem2_tid
, &ti
);
684 hr
= ITypeInfo_GetIDsOfNames(ti
, rgszNames
, cNames
, rgDispId
);
688 static HRESULT WINAPI
FolderItemImpl_Invoke(FolderItem2
*iface
,
689 DISPID dispIdMember
, REFIID riid
, LCID lcid
, WORD wFlags
,
690 DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
,
693 FolderItemImpl
*This
= impl_from_FolderItem(iface
);
697 TRACE("(%p,%d,%s,%d,%u,%p,%p,%p,%p)\n", iface
, dispIdMember
, shdebugstr_guid(riid
), lcid
,
698 wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
700 hr
= get_typeinfo(FolderItem2_tid
, &ti
);
702 hr
= ITypeInfo_Invoke(ti
, This
, dispIdMember
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
706 static HRESULT WINAPI
FolderItemImpl_get_Application(FolderItem2
*iface
,
709 FIXME("(%p,%p)\n", iface
, ppid
);
715 static HRESULT WINAPI
FolderItemImpl_get_Parent(FolderItem2
*iface
,
718 FIXME("(%p,%p)\n", iface
, ppid
);
724 static HRESULT WINAPI
FolderItemImpl_get_Name(FolderItem2
*iface
, BSTR
*pbs
)
726 FIXME("(%p,%p)\n", iface
, pbs
);
732 static HRESULT WINAPI
FolderItemImpl_put_Name(FolderItem2
*iface
, BSTR bs
)
734 FIXME("(%p,%s)\n", iface
, debugstr_w(bs
));
739 static HRESULT WINAPI
FolderItemImpl_get_Path(FolderItem2
*iface
, BSTR
*pbs
)
741 FolderItemImpl
*This
= impl_from_FolderItem(iface
);
746 TRACE("(%p,%p)\n", iface
, pbs
);
749 if (V_VT(&This
->dir
) == VT_I4
)
751 pathW
= HeapAlloc(GetProcessHeap(), 0, MAX_PATH
* sizeof(WCHAR
));
752 if (!pathW
) return E_OUTOFMEMORY
;
753 ret
= SHGetFolderPathW(NULL
, V_I4(&This
->dir
), NULL
, SHGFP_TYPE_CURRENT
,
756 *pbs
= SysAllocString(pathW
);
757 else if (ret
== E_INVALIDARG
)
759 FIXME("not implemented for %#x\n", V_I4(&This
->dir
));
762 HeapFree(GetProcessHeap(), 0, pathW
);
766 pathW
= V_BSTR(&This
->dir
);
767 len
= lstrlenW(pathW
);
768 *pbs
= SysAllocStringLen(pathW
, pathW
[len
- 1] == '\\' ? len
- 1 : len
);
770 if (ret
== S_OK
&& !*pbs
)
775 static HRESULT WINAPI
FolderItemImpl_get_GetLink(FolderItem2
*iface
,
778 FIXME("(%p,%p)\n", iface
, ppid
);
784 static HRESULT WINAPI
FolderItemImpl_get_GetFolder(FolderItem2
*iface
,
787 FIXME("(%p,%p)\n", iface
, ppid
);
793 static HRESULT WINAPI
FolderItemImpl_get_IsLink(FolderItem2
*iface
,
796 FIXME("(%p,%p)\n", iface
, pb
);
801 static HRESULT WINAPI
FolderItemImpl_get_IsFolder(FolderItem2
*iface
,
804 FIXME("(%p,%p)\n", iface
, pb
);
809 static HRESULT WINAPI
FolderItemImpl_get_IsFileSystem(FolderItem2
*iface
,
812 FIXME("(%p,%p)\n", iface
, pb
);
817 static HRESULT WINAPI
FolderItemImpl_get_IsBrowsable(FolderItem2
*iface
,
820 FIXME("(%p,%p)\n", iface
, pb
);
825 static HRESULT WINAPI
FolderItemImpl_get_ModifyDate(FolderItem2
*iface
,
828 FIXME("(%p,%p)\n", iface
, pdt
);
833 static HRESULT WINAPI
FolderItemImpl_put_ModifyDate(FolderItem2
*iface
, DATE dt
)
835 FIXME("(%p,%f)\n", iface
, dt
);
840 static HRESULT WINAPI
FolderItemImpl_get_Size(FolderItem2
*iface
, LONG
*pul
)
842 FIXME("(%p,%p)\n", iface
, pul
);
847 static HRESULT WINAPI
FolderItemImpl_get_Type(FolderItem2
*iface
, BSTR
*pbs
)
849 FIXME("(%p,%p)\n", iface
, pbs
);
855 static HRESULT WINAPI
FolderItemImpl_Verbs(FolderItem2
*iface
, FolderItemVerbs
**verbs
)
860 TRACE("(%p, %p)\n", iface
, verbs
);
867 hr
= FolderItem2_get_Path(iface
, &path
);
871 hr
= FolderItemVerbs_Constructor(path
, verbs
);
876 static HRESULT WINAPI
FolderItemImpl_InvokeVerb(FolderItem2
*iface
,
879 FIXME("(%p)\n", iface
);
884 static HRESULT WINAPI
FolderItemImpl_InvokeVerbEx(FolderItem2
*iface
, VARIANT verb
, VARIANT args
)
886 FIXME("(%p): stub\n", iface
);
891 static HRESULT WINAPI
FolderItemImpl_ExtendedProperty(FolderItem2
*iface
, BSTR propname
, VARIANT
*ret
)
893 FIXME("(%p)->(%s %p): stub\n", iface
, debugstr_w(propname
), ret
);
898 static const FolderItem2Vtbl FolderItemImpl_Vtbl
= {
899 FolderItemImpl_QueryInterface
,
900 FolderItemImpl_AddRef
,
901 FolderItemImpl_Release
,
902 FolderItemImpl_GetTypeInfoCount
,
903 FolderItemImpl_GetTypeInfo
,
904 FolderItemImpl_GetIDsOfNames
,
905 FolderItemImpl_Invoke
,
906 FolderItemImpl_get_Application
,
907 FolderItemImpl_get_Parent
,
908 FolderItemImpl_get_Name
,
909 FolderItemImpl_put_Name
,
910 FolderItemImpl_get_Path
,
911 FolderItemImpl_get_GetLink
,
912 FolderItemImpl_get_GetFolder
,
913 FolderItemImpl_get_IsLink
,
914 FolderItemImpl_get_IsFolder
,
915 FolderItemImpl_get_IsFileSystem
,
916 FolderItemImpl_get_IsBrowsable
,
917 FolderItemImpl_get_ModifyDate
,
918 FolderItemImpl_put_ModifyDate
,
919 FolderItemImpl_get_Size
,
920 FolderItemImpl_get_Type
,
921 FolderItemImpl_Verbs
,
922 FolderItemImpl_InvokeVerb
,
923 FolderItemImpl_InvokeVerbEx
,
924 FolderItemImpl_ExtendedProperty
927 static HRESULT
FolderItem_Constructor(VARIANT
*dir
, FolderItem
**ppfi
)
929 FolderItemImpl
*This
;
932 TRACE("%s\n", debugstr_variant(dir
));
936 This
= HeapAlloc(GetProcessHeap(), 0, sizeof(FolderItemImpl
));
937 if (!This
) return E_OUTOFMEMORY
;
938 This
->FolderItem2_iface
.lpVtbl
= &FolderItemImpl_Vtbl
;
941 VariantInit(&This
->dir
);
942 ret
= VariantCopy(&This
->dir
, dir
);
945 HeapFree(GetProcessHeap(), 0, This
);
946 return E_OUTOFMEMORY
;
949 *ppfi
= (FolderItem
*)&This
->FolderItem2_iface
;
953 static HRESULT WINAPI
FolderItemsImpl_QueryInterface(FolderItems3
*iface
,
954 REFIID riid
, LPVOID
*ppv
)
956 FolderItemsImpl
*This
= impl_from_FolderItems(iface
);
958 TRACE("(%p,%s,%p)\n", iface
, shdebugstr_guid(riid
), ppv
);
960 if (!ppv
) return E_INVALIDARG
;
962 if (IsEqualIID(&IID_IUnknown
, riid
) ||
963 IsEqualIID(&IID_IDispatch
, riid
) ||
964 IsEqualIID(&IID_FolderItems
, riid
) ||
965 IsEqualIID(&IID_FolderItems2
, riid
) ||
966 IsEqualIID(&IID_FolderItems3
, riid
))
967 *ppv
= &This
->FolderItems3_iface
;
970 FIXME("not implemented for %s\n", shdebugstr_guid(riid
));
972 return E_NOINTERFACE
;
974 IUnknown_AddRef((IUnknown
*)*ppv
);
978 static ULONG WINAPI
FolderItemsImpl_AddRef(FolderItems3
*iface
)
980 FolderItemsImpl
*This
= impl_from_FolderItems(iface
);
981 ULONG ref
= InterlockedIncrement(&This
->ref
);
983 TRACE("(%p), new refcount=%i\n", iface
, ref
);
988 static ULONG WINAPI
FolderItemsImpl_Release(FolderItems3
*iface
)
990 FolderItemsImpl
*This
= impl_from_FolderItems(iface
);
991 ULONG ref
= InterlockedDecrement(&This
->ref
);
993 TRACE("(%p), new refcount=%i\n", iface
, ref
);
996 HeapFree(GetProcessHeap(), 0, This
);
1000 static HRESULT WINAPI
FolderItemsImpl_GetTypeInfoCount(FolderItems3
*iface
,
1003 TRACE("(%p,%p)\n", iface
, count
);
1009 static HRESULT WINAPI
FolderItemsImpl_GetTypeInfo(FolderItems3
*iface
,
1010 UINT type
, LCID lcid
, ITypeInfo
**ppti
)
1014 TRACE("(%p,%u,%d,%p)\n", iface
, type
, lcid
, ppti
);
1016 hr
= get_typeinfo(FolderItems3_tid
, ppti
);
1018 ITypeInfo_AddRef(*ppti
);
1022 static HRESULT WINAPI
FolderItemsImpl_GetIDsOfNames(FolderItems3
*iface
,
1023 REFIID riid
, LPOLESTR
*names
, UINT count
, LCID lcid
, DISPID
*dispid
)
1028 TRACE("(%p,%s,%p,%u,%d,%p)\n", iface
, shdebugstr_guid(riid
), names
, count
, lcid
, dispid
);
1030 hr
= get_typeinfo(FolderItems3_tid
, &ti
);
1032 hr
= ITypeInfo_GetIDsOfNames(ti
, names
, count
, dispid
);
1036 static HRESULT WINAPI
FolderItemsImpl_Invoke(FolderItems3
*iface
,
1037 DISPID dispid
, REFIID riid
, LCID lcid
, WORD flags
, DISPPARAMS
*params
,
1038 VARIANT
*result
, EXCEPINFO
*ei
, UINT
*err
)
1040 FolderItemsImpl
*This
= impl_from_FolderItems(iface
);
1044 TRACE("(%p,%d,%s,%d,%u,%p,%p,%p,%p)\n", iface
, dispid
, shdebugstr_guid(riid
), lcid
, flags
, params
, result
, ei
, err
);
1046 hr
= get_typeinfo(FolderItems3_tid
, &ti
);
1048 hr
= ITypeInfo_Invoke(ti
, This
, dispid
, flags
, params
, result
, ei
, err
);
1052 static HRESULT WINAPI
FolderItemsImpl_get_Count(FolderItems3
*iface
, LONG
*count
)
1054 FIXME("(%p,%p)\n", iface
, count
);
1059 static HRESULT WINAPI
FolderItemsImpl_get_Application(FolderItems3
*iface
, IDispatch
**ppid
)
1061 FIXME("(%p,%p)\n", iface
, ppid
);
1064 return E_INVALIDARG
;
1070 static HRESULT WINAPI
FolderItemsImpl_get_Parent(FolderItems3
*iface
, IDispatch
**ppid
)
1072 TRACE("(%p,%p)\n", iface
, ppid
);
1080 static HRESULT WINAPI
FolderItemsImpl_Item(FolderItems3
*iface
, VARIANT index
, FolderItem
**ppid
)
1082 FIXME("(%p,%s,%p)\n", iface
, debugstr_variant(&index
), ppid
);
1088 static HRESULT WINAPI
FolderItemsImpl__NewEnum(FolderItems3
*iface
, IUnknown
**ppunk
)
1090 FIXME("(%p,%p)\n", iface
, ppunk
);
1093 return E_INVALIDARG
;
1099 static HRESULT WINAPI
FolderItemsImpl_InvokeVerbEx(FolderItems3
*iface
, VARIANT verb
, VARIANT args
)
1101 FIXME("(%p,%s,%s)\n", iface
, debugstr_variant(&verb
), debugstr_variant(&args
));
1106 static HRESULT WINAPI
FolderItemsImpl_Filter(FolderItems3
*iface
, LONG flags
, BSTR spec
)
1108 FIXME("(%p,%d,%s)\n", iface
, flags
, wine_dbgstr_w(spec
));
1113 static HRESULT WINAPI
FolderItemsImpl_get_Verbs(FolderItems3
*iface
, FolderItemVerbs
**ppfic
)
1115 FIXME("(%p,%p)\n", iface
, ppfic
);
1118 return E_INVALIDARG
;
1124 static const FolderItems3Vtbl FolderItemsImpl_Vtbl
= {
1125 FolderItemsImpl_QueryInterface
,
1126 FolderItemsImpl_AddRef
,
1127 FolderItemsImpl_Release
,
1128 FolderItemsImpl_GetTypeInfoCount
,
1129 FolderItemsImpl_GetTypeInfo
,
1130 FolderItemsImpl_GetIDsOfNames
,
1131 FolderItemsImpl_Invoke
,
1132 FolderItemsImpl_get_Count
,
1133 FolderItemsImpl_get_Application
,
1134 FolderItemsImpl_get_Parent
,
1135 FolderItemsImpl_Item
,
1136 FolderItemsImpl__NewEnum
,
1137 FolderItemsImpl_InvokeVerbEx
,
1138 FolderItemsImpl_Filter
,
1139 FolderItemsImpl_get_Verbs
1142 static HRESULT
FolderItems_Constructor(FolderItems
**ppfi
)
1144 FolderItemsImpl
*This
;
1150 This
= HeapAlloc(GetProcessHeap(), 0, sizeof(FolderItemsImpl
));
1151 if (!This
) return E_OUTOFMEMORY
;
1152 This
->FolderItems3_iface
.lpVtbl
= &FolderItemsImpl_Vtbl
;
1155 *ppfi
= (FolderItems
*)&This
->FolderItems3_iface
;
1159 static HRESULT WINAPI
FolderImpl_QueryInterface(Folder3
*iface
, REFIID riid
,
1162 FolderImpl
*This
= impl_from_Folder(iface
);
1164 TRACE("(%p,%s,%p)\n", iface
, shdebugstr_guid(riid
), ppv
);
1166 if (!ppv
) return E_INVALIDARG
;
1168 if (IsEqualIID(&IID_IUnknown
, riid
) ||
1169 IsEqualIID(&IID_IDispatch
, riid
) ||
1170 IsEqualIID(&IID_Folder
, riid
) ||
1171 IsEqualIID(&IID_Folder2
, riid
) ||
1172 IsEqualIID(&IID_Folder3
, riid
))
1173 *ppv
= &This
->Folder3_iface
;
1176 FIXME("not implemented for %s\n", shdebugstr_guid(riid
));
1178 return E_NOINTERFACE
;
1180 IUnknown_AddRef((IUnknown
*)*ppv
);
1184 static ULONG WINAPI
FolderImpl_AddRef(Folder3
*iface
)
1186 FolderImpl
*This
= impl_from_Folder(iface
);
1187 ULONG ref
= InterlockedIncrement(&This
->ref
);
1189 TRACE("(%p), new refcount=%i\n", iface
, ref
);
1194 static ULONG WINAPI
FolderImpl_Release(Folder3
*iface
)
1196 FolderImpl
*This
= impl_from_Folder(iface
);
1197 ULONG ref
= InterlockedDecrement(&This
->ref
);
1199 TRACE("(%p), new refcount=%i\n", iface
, ref
);
1203 VariantClear(&This
->dir
);
1204 HeapFree(GetProcessHeap(), 0, This
);
1209 static HRESULT WINAPI
FolderImpl_GetTypeInfoCount(Folder3
*iface
, UINT
*pctinfo
)
1211 TRACE("(%p,%p)\n", iface
, pctinfo
);
1217 static HRESULT WINAPI
FolderImpl_GetTypeInfo(Folder3
*iface
, UINT iTInfo
,
1218 LCID lcid
, ITypeInfo
**ppTInfo
)
1222 TRACE("(%p,%u,%d,%p)\n", iface
, iTInfo
, lcid
, ppTInfo
);
1224 hr
= get_typeinfo(Folder3_tid
, ppTInfo
);
1226 ITypeInfo_AddRef(*ppTInfo
);
1231 static HRESULT WINAPI
FolderImpl_GetIDsOfNames(Folder3
*iface
, REFIID riid
,
1232 LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
1237 TRACE("(%p,%s,%p,%u,%d,%p)\n", iface
, shdebugstr_guid(riid
), rgszNames
, cNames
, lcid
,
1240 hr
= get_typeinfo(Folder3_tid
, &ti
);
1242 hr
= ITypeInfo_GetIDsOfNames(ti
, rgszNames
, cNames
, rgDispId
);
1246 static HRESULT WINAPI
FolderImpl_Invoke(Folder3
*iface
, DISPID dispIdMember
,
1247 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
,
1248 VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
1250 FolderImpl
*This
= impl_from_Folder(iface
);
1254 TRACE("(%p,%d,%s,%d,%u,%p,%p,%p,%p)\n", iface
, dispIdMember
, shdebugstr_guid(riid
), lcid
,
1255 wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
1257 hr
= get_typeinfo(Folder3_tid
, &ti
);
1259 hr
= ITypeInfo_Invoke(ti
, This
, dispIdMember
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
1263 static HRESULT WINAPI
FolderImpl_get_Title(Folder3
*iface
, BSTR
*pbs
)
1265 FolderImpl
*This
= impl_from_Folder(iface
);
1269 TRACE("(%p,%p)\n", iface
, pbs
);
1273 if (V_VT(&This
->dir
) == VT_I4
)
1275 FIXME("special folder constants are not supported\n");
1278 p
= PathFindFileNameW(V_BSTR(&This
->dir
));
1280 *pbs
= SysAllocStringLen(p
, p
[len
- 1] == '\\' ? len
- 1 : len
);
1281 return *pbs
? S_OK
: E_OUTOFMEMORY
;
1284 static HRESULT WINAPI
FolderImpl_get_Application(Folder3
*iface
,
1287 FIXME("(%p,%p)\n", iface
, ppid
);
1293 static HRESULT WINAPI
FolderImpl_get_Parent(Folder3
*iface
, IDispatch
**ppid
)
1295 FIXME("(%p,%p)\n", iface
, ppid
);
1301 static HRESULT WINAPI
FolderImpl_get_ParentFolder(Folder3
*iface
, Folder
**ppsf
)
1303 FIXME("(%p,%p)\n", iface
, ppsf
);
1309 static HRESULT WINAPI
FolderImpl_Items(Folder3
*iface
, FolderItems
**ppid
)
1311 FIXME("(%p,%p)\n", iface
, ppid
);
1313 return FolderItems_Constructor(ppid
);
1316 static HRESULT WINAPI
FolderImpl_ParseName(Folder3
*iface
, BSTR name
, FolderItem
**item
)
1320 WCHAR pathW
[MAX_PATH
];
1324 TRACE("(%p,%s,%p)\n", iface
, debugstr_w(name
), item
);
1328 if (!name
|| !name
[0])
1331 hr
= Folder3_get_Self(iface
, &self
);
1335 hr
= FolderItem_get_Path(self
, &str
);
1336 FolderItem_Release(self
);
1338 PathCombineW(pathW
, str
, name
);
1341 if (!PathFileExistsW(pathW
))
1345 V_BSTR(&v
) = SysAllocString(pathW
);
1346 hr
= FolderItem_Constructor(&v
, item
);
1351 static HRESULT WINAPI
FolderImpl_NewFolder(Folder3
*iface
, BSTR bName
,
1354 FIXME("(%p,%s)\n", iface
, debugstr_w(bName
));
1359 static HRESULT WINAPI
FolderImpl_MoveHere(Folder3
*iface
, VARIANT vItem
,
1362 FIXME("(%p)\n", iface
);
1367 static HRESULT WINAPI
FolderImpl_CopyHere(Folder3
*iface
, VARIANT vItem
,
1370 FIXME("(%p)\n", iface
);
1375 static HRESULT WINAPI
FolderImpl_GetDetailsOf(Folder3
*iface
, VARIANT vItem
,
1376 int iColumn
, BSTR
*pbs
)
1378 FIXME("(%p,%d,%p)\n", iface
, iColumn
, pbs
);
1384 static HRESULT WINAPI
FolderImpl_get_Self(Folder3
*iface
, FolderItem
**ppfi
)
1386 FolderImpl
*This
= impl_from_Folder(iface
);
1388 TRACE("(%p,%p)\n", iface
, ppfi
);
1390 return FolderItem_Constructor(&This
->dir
, ppfi
);
1393 static HRESULT WINAPI
FolderImpl_get_OfflineStatus(Folder3
*iface
, LONG
*pul
)
1395 FIXME("(%p,%p)\n", iface
, pul
);
1400 static HRESULT WINAPI
FolderImpl_Synchronize(Folder3
*iface
)
1402 FIXME("(%p)\n", iface
);
1407 static HRESULT WINAPI
FolderImpl_get_HaveToShowWebViewBarricade(Folder3
*iface
,
1408 VARIANT_BOOL
*pbHaveToShowWebViewBarricade
)
1410 FIXME("(%p,%p)\n", iface
, pbHaveToShowWebViewBarricade
);
1415 static HRESULT WINAPI
FolderImpl_DismissedWebViewBarricade(Folder3
*iface
)
1417 FIXME("(%p)\n", iface
);
1422 static HRESULT WINAPI
FolderImpl_get_ShowWebViewBarricade(Folder3
*iface
,
1423 VARIANT_BOOL
*pbShowWebViewBarricade
)
1425 FIXME("(%p,%p)\n", iface
, pbShowWebViewBarricade
);
1430 static HRESULT WINAPI
FolderImpl_put_ShowWebViewBarricade(Folder3
*iface
,
1431 VARIANT_BOOL bShowWebViewBarricade
)
1433 FIXME("(%p,%d)\n", iface
, bShowWebViewBarricade
);
1438 static const Folder3Vtbl FolderImpl_Vtbl
= {
1439 FolderImpl_QueryInterface
,
1442 FolderImpl_GetTypeInfoCount
,
1443 FolderImpl_GetTypeInfo
,
1444 FolderImpl_GetIDsOfNames
,
1446 FolderImpl_get_Title
,
1447 FolderImpl_get_Application
,
1448 FolderImpl_get_Parent
,
1449 FolderImpl_get_ParentFolder
,
1451 FolderImpl_ParseName
,
1452 FolderImpl_NewFolder
,
1453 FolderImpl_MoveHere
,
1454 FolderImpl_CopyHere
,
1455 FolderImpl_GetDetailsOf
,
1456 FolderImpl_get_Self
,
1457 FolderImpl_get_OfflineStatus
,
1458 FolderImpl_Synchronize
,
1459 FolderImpl_get_HaveToShowWebViewBarricade
,
1460 FolderImpl_DismissedWebViewBarricade
,
1461 FolderImpl_get_ShowWebViewBarricade
,
1462 FolderImpl_put_ShowWebViewBarricade
1465 static HRESULT
Folder_Constructor(VARIANT
*dir
, Folder
**ppsdf
)
1475 /* FIXME: add some checks */
1478 if (PathIsDirectoryW(V_BSTR(dir
)) &&
1479 !PathIsRelativeW(V_BSTR(dir
)) &&
1480 PathFileExistsW(V_BSTR(dir
)))
1486 This
= HeapAlloc(GetProcessHeap(), 0, sizeof(FolderImpl
));
1487 if (!This
) return E_OUTOFMEMORY
;
1488 This
->Folder3_iface
.lpVtbl
= &FolderImpl_Vtbl
;
1491 VariantInit(&This
->dir
);
1492 ret
= VariantCopy(&This
->dir
, dir
);
1495 HeapFree(GetProcessHeap(), 0, This
);
1496 return E_OUTOFMEMORY
;
1499 *ppsdf
= (Folder
*)&This
->Folder3_iface
;
1503 static HRESULT WINAPI
ShellDispatch_QueryInterface(IShellDispatch6
*iface
,
1504 REFIID riid
, LPVOID
*ppv
)
1506 ShellDispatch
*This
= impl_from_IShellDispatch6(iface
);
1508 TRACE("(%p,%s,%p)\n", iface
, shdebugstr_guid(riid
), ppv
);
1510 if (!ppv
) return E_INVALIDARG
;
1512 if (IsEqualIID(&IID_IUnknown
, riid
) ||
1513 IsEqualIID(&IID_IDispatch
, riid
) ||
1514 IsEqualIID(&IID_IShellDispatch
, riid
) ||
1515 IsEqualIID(&IID_IShellDispatch2
, riid
) ||
1516 IsEqualIID(&IID_IShellDispatch3
, riid
) ||
1517 IsEqualIID(&IID_IShellDispatch4
, riid
) ||
1518 IsEqualIID(&IID_IShellDispatch5
, riid
) ||
1519 IsEqualIID(&IID_IShellDispatch6
, riid
))
1520 *ppv
= &This
->IShellDispatch6_iface
;
1523 FIXME("not implemented for %s\n", shdebugstr_guid(riid
));
1525 return E_NOINTERFACE
;
1528 IShellDispatch6_AddRef(iface
);
1532 static ULONG WINAPI
ShellDispatch_AddRef(IShellDispatch6
*iface
)
1534 ShellDispatch
*This
= impl_from_IShellDispatch6(iface
);
1535 ULONG ref
= InterlockedIncrement(&This
->ref
);
1537 TRACE("(%p), new refcount=%i\n", iface
, ref
);
1542 static ULONG WINAPI
ShellDispatch_Release(IShellDispatch6
*iface
)
1544 ShellDispatch
*This
= impl_from_IShellDispatch6(iface
);
1545 ULONG ref
= InterlockedDecrement(&This
->ref
);
1547 TRACE("(%p), new refcount=%i\n", iface
, ref
);
1550 HeapFree(GetProcessHeap(), 0, This
);
1555 static HRESULT WINAPI
ShellDispatch_GetTypeInfoCount(IShellDispatch6
*iface
,
1558 TRACE("(%p,%p)\n", iface
, pctinfo
);
1564 static HRESULT WINAPI
ShellDispatch_GetTypeInfo(IShellDispatch6
*iface
,
1565 UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
1569 TRACE("(%p,%u,%d,%p)\n", iface
, iTInfo
, lcid
, ppTInfo
);
1571 hr
= get_typeinfo(IShellDispatch6_tid
, ppTInfo
);
1573 ITypeInfo_AddRef(*ppTInfo
);
1577 static HRESULT WINAPI
ShellDispatch_GetIDsOfNames(IShellDispatch6
*iface
,
1578 REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
1583 TRACE("(%p,%s,%p,%u,%d,%p)\n", iface
, shdebugstr_guid(riid
), rgszNames
, cNames
, lcid
,
1586 hr
= get_typeinfo(IShellDispatch6_tid
, &ti
);
1588 hr
= ITypeInfo_GetIDsOfNames(ti
, rgszNames
, cNames
, rgDispId
);
1592 static HRESULT WINAPI
ShellDispatch_Invoke(IShellDispatch6
*iface
,
1593 DISPID dispIdMember
, REFIID riid
, LCID lcid
, WORD wFlags
,
1594 DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
,
1597 ShellDispatch
*This
= impl_from_IShellDispatch6(iface
);
1601 TRACE("(%p,%d,%s,%d,%u,%p,%p,%p,%p)\n", iface
, dispIdMember
, shdebugstr_guid(riid
), lcid
,
1602 wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
1604 hr
= get_typeinfo(IShellDispatch6_tid
, &ti
);
1606 hr
= ITypeInfo_Invoke(ti
, &This
->IShellDispatch6_iface
, dispIdMember
, wFlags
, pDispParams
,
1607 pVarResult
, pExcepInfo
, puArgErr
);
1611 static HRESULT WINAPI
ShellDispatch_get_Application(IShellDispatch6
*iface
,
1614 FIXME("(%p,%p)\n", iface
, ppid
);
1620 static HRESULT WINAPI
ShellDispatch_get_Parent(IShellDispatch6
*iface
,
1623 FIXME("(%p,%p)\n", iface
, ppid
);
1629 static HRESULT WINAPI
ShellDispatch_NameSpace(IShellDispatch6
*iface
,
1630 VARIANT vDir
, Folder
**ppsdf
)
1632 TRACE("(%p,%p)\n", iface
, ppsdf
);
1634 return Folder_Constructor(&vDir
, ppsdf
);
1637 static HRESULT WINAPI
ShellDispatch_BrowseForFolder(IShellDispatch6
*iface
,
1638 LONG Hwnd
, BSTR Title
, LONG Options
, VARIANT RootFolder
, Folder
**ppsdf
)
1640 FIXME("(%p,%x,%s,%x,%p)\n", iface
, Hwnd
, debugstr_w(Title
), Options
, ppsdf
);
1646 static HRESULT WINAPI
ShellDispatch_Windows(IShellDispatch6
*iface
,
1649 FIXME("(%p,%p)\n", iface
, ppid
);
1655 static HRESULT WINAPI
ShellDispatch_Open(IShellDispatch6
*iface
, VARIANT vDir
)
1657 FIXME("(%p)\n", iface
);
1662 static HRESULT WINAPI
ShellDispatch_Explore(IShellDispatch6
*iface
, VARIANT vDir
)
1664 FIXME("(%p)\n", iface
);
1669 static HRESULT WINAPI
ShellDispatch_MinimizeAll(IShellDispatch6
*iface
)
1671 FIXME("(%p)\n", iface
);
1676 static HRESULT WINAPI
ShellDispatch_UndoMinimizeALL(IShellDispatch6
*iface
)
1678 FIXME("(%p)\n", iface
);
1683 static HRESULT WINAPI
ShellDispatch_FileRun(IShellDispatch6
*iface
)
1685 FIXME("(%p)\n", iface
);
1690 static HRESULT WINAPI
ShellDispatch_CascadeWindows(IShellDispatch6
*iface
)
1692 FIXME("(%p)\n", iface
);
1697 static HRESULT WINAPI
ShellDispatch_TileVertically(IShellDispatch6
*iface
)
1699 FIXME("(%p)\n", iface
);
1704 static HRESULT WINAPI
ShellDispatch_TileHorizontally(IShellDispatch6
*iface
)
1706 FIXME("(%p)\n", iface
);
1711 static HRESULT WINAPI
ShellDispatch_ShutdownWindows(IShellDispatch6
*iface
)
1713 FIXME("(%p)\n", iface
);
1718 static HRESULT WINAPI
ShellDispatch_Suspend(IShellDispatch6
*iface
)
1720 FIXME("(%p)\n", iface
);
1725 static HRESULT WINAPI
ShellDispatch_EjectPC(IShellDispatch6
*iface
)
1727 FIXME("(%p)\n", iface
);
1732 static HRESULT WINAPI
ShellDispatch_SetTime(IShellDispatch6
*iface
)
1734 FIXME("(%p)\n", iface
);
1739 static HRESULT WINAPI
ShellDispatch_TrayProperties(IShellDispatch6
*iface
)
1741 FIXME("(%p)\n", iface
);
1746 static HRESULT WINAPI
ShellDispatch_Help(IShellDispatch6
*iface
)
1748 FIXME("(%p)\n", iface
);
1753 static HRESULT WINAPI
ShellDispatch_FindFiles(IShellDispatch6
*iface
)
1755 FIXME("(%p)\n", iface
);
1760 static HRESULT WINAPI
ShellDispatch_FindComputer(IShellDispatch6
*iface
)
1762 FIXME("(%p)\n", iface
);
1767 static HRESULT WINAPI
ShellDispatch_RefreshMenu(IShellDispatch6
*iface
)
1769 FIXME("(%p)\n", iface
);
1774 static HRESULT WINAPI
ShellDispatch_ControlPanelItem(IShellDispatch6
*iface
,
1777 FIXME("(%p,%s)\n", iface
, debugstr_w(szDir
));
1782 static HRESULT WINAPI
ShellDispatch_IsRestricted(IShellDispatch6
*iface
, BSTR group
, BSTR restriction
, LONG
*value
)
1784 FIXME("(%s, %s, %p): stub\n", debugstr_w(group
), debugstr_w(restriction
), value
);
1788 static HRESULT WINAPI
ShellDispatch_ShellExecute(IShellDispatch6
*iface
,
1789 BSTR file
, VARIANT v_args
, VARIANT v_dir
, VARIANT v_op
, VARIANT v_show
)
1791 VARIANT args_str
, dir_str
, op_str
, show_int
;
1792 WCHAR
*args
= NULL
, *dir
= NULL
, *op
= NULL
;
1796 TRACE("(%s, %s, %s, %s, %s)\n", debugstr_w(file
), debugstr_variant(&v_args
),
1797 debugstr_variant(&v_dir
), debugstr_variant(&v_op
), debugstr_variant(&v_show
));
1799 VariantInit(&args_str
);
1800 VariantChangeType(&args_str
, &v_args
, 0, VT_BSTR
);
1801 if (V_VT(&args_str
) == VT_BSTR
)
1802 args
= V_BSTR(&args_str
);
1804 VariantInit(&dir_str
);
1805 VariantChangeType(&dir_str
, &v_dir
, 0, VT_BSTR
);
1806 if (V_VT(&dir_str
) == VT_BSTR
)
1807 dir
= V_BSTR(&dir_str
);
1809 VariantInit(&op_str
);
1810 VariantChangeType(&op_str
, &v_op
, 0, VT_BSTR
);
1811 if (V_VT(&op_str
) == VT_BSTR
)
1812 op
= V_BSTR(&op_str
);
1814 VariantInit(&show_int
);
1815 VariantChangeType(&show_int
, &v_show
, 0, VT_I4
);
1816 if (V_VT(&show_int
) == VT_I4
)
1817 show
= V_I4(&show_int
);
1819 ret
= ShellExecuteW(NULL
, op
, file
, args
, dir
, show
);
1821 VariantClear(&args_str
);
1822 VariantClear(&dir_str
);
1823 VariantClear(&op_str
);
1824 VariantClear(&show_int
);
1826 return (ULONG_PTR
)ret
> 32 ? S_OK
: S_FALSE
;
1829 static HRESULT WINAPI
ShellDispatch_FindPrinter(IShellDispatch6
*iface
, BSTR name
, BSTR location
, BSTR model
)
1831 FIXME("(%s, %s, %s): stub\n", debugstr_w(name
), debugstr_w(location
), debugstr_w(model
));
1835 static HRESULT WINAPI
ShellDispatch_GetSystemInformation(IShellDispatch6
*iface
, BSTR name
, VARIANT
*ret
)
1837 FIXME("(%s, %p): stub\n", debugstr_w(name
), ret
);
1841 static HRESULT WINAPI
ShellDispatch_ServiceStart(IShellDispatch6
*iface
, BSTR service
, VARIANT persistent
, VARIANT
*ret
)
1843 FIXME("(%s, %p): stub\n", debugstr_w(service
), ret
);
1847 static HRESULT WINAPI
ShellDispatch_ServiceStop(IShellDispatch6
*iface
, BSTR service
, VARIANT persistent
, VARIANT
*ret
)
1849 FIXME("(%s, %p): stub\n", debugstr_w(service
), ret
);
1853 static HRESULT WINAPI
ShellDispatch_IsServiceRunning(IShellDispatch6
*iface
, BSTR name
, VARIANT
*running
)
1855 SERVICE_STATUS_PROCESS status
;
1856 SC_HANDLE scm
, service
;
1859 TRACE("(%s, %p)\n", debugstr_w(name
), running
);
1861 V_VT(running
) = VT_BOOL
;
1862 V_BOOL(running
) = VARIANT_FALSE
;
1864 scm
= OpenSCManagerW(NULL
, NULL
, SC_MANAGER_CONNECT
);
1867 ERR("failed to connect to service manager\n");
1871 service
= OpenServiceW(scm
, name
, SERVICE_QUERY_STATUS
);
1874 ERR("Failed to open service %s (%u)\n", debugstr_w(name
), GetLastError());
1875 CloseServiceHandle(scm
);
1879 if (!QueryServiceStatusEx(service
, SC_STATUS_PROCESS_INFO
, (BYTE
*)&status
,
1880 sizeof(SERVICE_STATUS_PROCESS
), &dummy
))
1882 TRACE("failed to query service status (%u)\n", GetLastError());
1883 CloseServiceHandle(service
);
1884 CloseServiceHandle(scm
);
1888 if (status
.dwCurrentState
== SERVICE_RUNNING
)
1889 V_BOOL(running
) = VARIANT_TRUE
;
1891 CloseServiceHandle(service
);
1892 CloseServiceHandle(scm
);
1897 static HRESULT WINAPI
ShellDispatch_CanStartStopService(IShellDispatch6
*iface
, BSTR service
, VARIANT
*ret
)
1899 FIXME("(%s, %p): stub\n", debugstr_w(service
), ret
);
1903 static HRESULT WINAPI
ShellDispatch_ShowBrowserBar(IShellDispatch6
*iface
, BSTR clsid
, VARIANT show
, VARIANT
*ret
)
1905 FIXME("(%s, %p): stub\n", debugstr_w(clsid
), ret
);
1909 static HRESULT WINAPI
ShellDispatch_AddToRecent(IShellDispatch6
*iface
, VARIANT file
, BSTR category
)
1911 FIXME("(%s): stub\n", debugstr_w(category
));
1915 static HRESULT WINAPI
ShellDispatch_WindowsSecurity(IShellDispatch6
*iface
)
1921 static HRESULT WINAPI
ShellDispatch_ToggleDesktop(IShellDispatch6
*iface
)
1927 static HRESULT WINAPI
ShellDispatch_ExplorerPolicy(IShellDispatch6
*iface
, BSTR policy
, VARIANT
*value
)
1929 FIXME("(%s, %p): stub\n", debugstr_w(policy
), value
);
1933 static HRESULT WINAPI
ShellDispatch_GetSetting(IShellDispatch6
*iface
, LONG setting
, VARIANT_BOOL
*result
)
1935 FIXME("(%d %p): stub\n", setting
, result
);
1939 static HRESULT WINAPI
ShellDispatch_WindowSwitcher(IShellDispatch6
*iface
)
1945 static HRESULT WINAPI
ShellDispatch_SearchCommand(IShellDispatch6
*iface
)
1951 static const IShellDispatch6Vtbl ShellDispatchVtbl
= {
1952 ShellDispatch_QueryInterface
,
1953 ShellDispatch_AddRef
,
1954 ShellDispatch_Release
,
1955 ShellDispatch_GetTypeInfoCount
,
1956 ShellDispatch_GetTypeInfo
,
1957 ShellDispatch_GetIDsOfNames
,
1958 ShellDispatch_Invoke
,
1959 ShellDispatch_get_Application
,
1960 ShellDispatch_get_Parent
,
1961 ShellDispatch_NameSpace
,
1962 ShellDispatch_BrowseForFolder
,
1963 ShellDispatch_Windows
,
1965 ShellDispatch_Explore
,
1966 ShellDispatch_MinimizeAll
,
1967 ShellDispatch_UndoMinimizeALL
,
1968 ShellDispatch_FileRun
,
1969 ShellDispatch_CascadeWindows
,
1970 ShellDispatch_TileVertically
,
1971 ShellDispatch_TileHorizontally
,
1972 ShellDispatch_ShutdownWindows
,
1973 ShellDispatch_Suspend
,
1974 ShellDispatch_EjectPC
,
1975 ShellDispatch_SetTime
,
1976 ShellDispatch_TrayProperties
,
1978 ShellDispatch_FindFiles
,
1979 ShellDispatch_FindComputer
,
1980 ShellDispatch_RefreshMenu
,
1981 ShellDispatch_ControlPanelItem
,
1982 ShellDispatch_IsRestricted
,
1983 ShellDispatch_ShellExecute
,
1984 ShellDispatch_FindPrinter
,
1985 ShellDispatch_GetSystemInformation
,
1986 ShellDispatch_ServiceStart
,
1987 ShellDispatch_ServiceStop
,
1988 ShellDispatch_IsServiceRunning
,
1989 ShellDispatch_CanStartStopService
,
1990 ShellDispatch_ShowBrowserBar
,
1991 ShellDispatch_AddToRecent
,
1992 ShellDispatch_WindowsSecurity
,
1993 ShellDispatch_ToggleDesktop
,
1994 ShellDispatch_ExplorerPolicy
,
1995 ShellDispatch_GetSetting
,
1996 ShellDispatch_WindowSwitcher
,
1997 ShellDispatch_SearchCommand
2000 HRESULT WINAPI
IShellDispatch_Constructor(IUnknown
*outer
, REFIID riid
, void **ppv
)
2002 ShellDispatch
*This
;
2005 TRACE("(%p, %s)\n", outer
, debugstr_guid(riid
));
2009 if (outer
) return CLASS_E_NOAGGREGATION
;
2011 This
= HeapAlloc(GetProcessHeap(), 0, sizeof(ShellDispatch
));
2012 if (!This
) return E_OUTOFMEMORY
;
2013 This
->IShellDispatch6_iface
.lpVtbl
= &ShellDispatchVtbl
;
2016 ret
= IShellDispatch6_QueryInterface(&This
->IShellDispatch6_iface
, riid
, ppv
);
2017 IShellDispatch6_Release(&This
->IShellDispatch6_iface
);