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"
27 #define NONAMELESSUNION
28 #define NONAMELESSSTRUCT
39 #include "wine/debug.h"
41 WINE_DEFAULT_DEBUG_CHANNEL(shell
);
51 static ITypeLib
*typelib
;
52 static const IID
* const tid_ids
[] =
59 static ITypeInfo
*typeinfos
[LAST_tid
];
62 IShellDispatch5 IShellDispatch5_iface
;
67 Folder3 Folder3_iface
;
73 FolderItem FolderItem_iface
;
78 static inline ShellDispatch
*impl_from_IShellDispatch5(IShellDispatch5
*iface
)
80 return CONTAINING_RECORD(iface
, ShellDispatch
, IShellDispatch5_iface
);
83 static inline FolderImpl
*impl_from_Folder(Folder3
*iface
)
85 return CONTAINING_RECORD(iface
, FolderImpl
, Folder3_iface
);
88 static inline FolderItemImpl
*impl_from_FolderItem(FolderItem
*iface
)
90 return CONTAINING_RECORD(iface
, FolderItemImpl
, FolderItem_iface
);
93 static HRESULT
load_typelib(void)
98 hr
= LoadRegTypeLib(&LIBID_Shell32
, 1, 0, LOCALE_SYSTEM_DEFAULT
, &tl
);
100 ERR("LoadRegTypeLib failed: %08x\n", hr
);
104 if (InterlockedCompareExchangePointer((void**)&typelib
, tl
, NULL
))
105 ITypeLib_Release(tl
);
109 void release_typelib(void)
116 for (i
= 0; i
< sizeof(typeinfos
)/sizeof(*typeinfos
); i
++)
118 ITypeInfo_Release(typeinfos
[i
]);
120 ITypeLib_Release(typelib
);
123 static HRESULT
get_typeinfo(enum tid_t tid
, ITypeInfo
**typeinfo
)
136 hr
= ITypeLib_GetTypeInfoOfGuid(typelib
, tid_ids
[tid
], &ti
);
139 ERR("GetTypeInfoOfGuid(%s) failed: %08x\n", debugstr_guid(tid_ids
[tid
]), hr
);
143 if (InterlockedCompareExchangePointer((void**)(typeinfos
+tid
), ti
, NULL
))
144 ITypeInfo_Release(ti
);
147 *typeinfo
= typeinfos
[tid
];
151 static HRESULT WINAPI
FolderItemImpl_QueryInterface(FolderItem
*iface
,
152 REFIID riid
, LPVOID
*ppv
)
154 FolderItemImpl
*This
= impl_from_FolderItem(iface
);
156 TRACE("(%p,%p,%p)\n", iface
, riid
, ppv
);
158 if (!ppv
) return E_INVALIDARG
;
160 if (IsEqualIID(&IID_IUnknown
, riid
) ||
161 IsEqualIID(&IID_IDispatch
, riid
) ||
162 IsEqualIID(&IID_FolderItem
, riid
))
163 *ppv
= &This
->FolderItem_iface
;
166 FIXME("not implemented for %s\n", shdebugstr_guid(riid
));
168 return E_NOINTERFACE
;
170 IUnknown_AddRef((IUnknown
*)*ppv
);
174 static ULONG WINAPI
FolderItemImpl_AddRef(FolderItem
*iface
)
176 FolderItemImpl
*This
= impl_from_FolderItem(iface
);
177 ULONG ref
= InterlockedIncrement(&This
->ref
);
179 TRACE("(%p), new refcount=%i\n", iface
, ref
);
184 static ULONG WINAPI
FolderItemImpl_Release(FolderItem
*iface
)
186 FolderItemImpl
*This
= impl_from_FolderItem(iface
);
187 ULONG ref
= InterlockedDecrement(&This
->ref
);
189 TRACE("(%p), new refcount=%i\n", iface
, ref
);
193 VariantClear(&This
->dir
);
194 HeapFree(GetProcessHeap(), 0, This
);
199 static HRESULT WINAPI
FolderItemImpl_GetTypeInfoCount(FolderItem
*iface
,
202 TRACE("(%p,%p)\n", iface
, pctinfo
);
208 static HRESULT WINAPI
FolderItemImpl_GetTypeInfo(FolderItem
*iface
, UINT iTInfo
,
209 LCID lcid
, ITypeInfo
**ppTInfo
)
213 TRACE("(%p,%u,%d,%p)\n", iface
, iTInfo
, lcid
, ppTInfo
);
215 hr
= get_typeinfo(FolderItem_tid
, ppTInfo
);
217 ITypeInfo_AddRef(*ppTInfo
);
221 static HRESULT WINAPI
FolderItemImpl_GetIDsOfNames(FolderItem
*iface
,
222 REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
,
228 TRACE("(%p,%p,%p,%u,%d,%p)\n", iface
, riid
, rgszNames
, cNames
, lcid
,
231 hr
= get_typeinfo(FolderItem_tid
, &ti
);
233 hr
= ITypeInfo_GetIDsOfNames(ti
, rgszNames
, cNames
, rgDispId
);
237 static HRESULT WINAPI
FolderItemImpl_Invoke(FolderItem
*iface
,
238 DISPID dispIdMember
, REFIID riid
, LCID lcid
, WORD wFlags
,
239 DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
,
242 FolderItemImpl
*This
= impl_from_FolderItem(iface
);
246 TRACE("(%p,%d,%p,%d,%u,%p,%p,%p,%p)\n", iface
, dispIdMember
, riid
, lcid
,
247 wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
249 hr
= get_typeinfo(FolderItem_tid
, &ti
);
251 hr
= ITypeInfo_Invoke(ti
, This
, dispIdMember
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
255 static HRESULT WINAPI
FolderItemImpl_get_Application(FolderItem
*iface
,
258 FIXME("(%p,%p)\n", iface
, ppid
);
264 static HRESULT WINAPI
FolderItemImpl_get_Parent(FolderItem
*iface
,
267 FIXME("(%p,%p)\n", iface
, ppid
);
273 static HRESULT WINAPI
FolderItemImpl_get_Name(FolderItem
*iface
, BSTR
*pbs
)
275 FIXME("(%p,%p)\n", iface
, pbs
);
281 static HRESULT WINAPI
FolderItemImpl_put_Name(FolderItem
*iface
, BSTR bs
)
283 FIXME("(%p,%s)\n", iface
, debugstr_w(bs
));
288 static HRESULT WINAPI
FolderItemImpl_get_Path(FolderItem
*iface
, BSTR
*pbs
)
290 FolderItemImpl
*This
= impl_from_FolderItem(iface
);
295 TRACE("(%p,%p)\n", iface
, pbs
);
298 if (V_VT(&This
->dir
) == VT_I4
)
300 pathW
= HeapAlloc(GetProcessHeap(), 0, MAX_PATH
* sizeof(WCHAR
));
301 if (!pathW
) return E_OUTOFMEMORY
;
302 ret
= SHGetFolderPathW(NULL
, V_I4(&This
->dir
), NULL
, SHGFP_TYPE_CURRENT
,
305 *pbs
= SysAllocString(pathW
);
306 else if (ret
== E_INVALIDARG
)
308 FIXME("not implemented for %#x\n", V_I4(&This
->dir
));
311 HeapFree(GetProcessHeap(), 0, pathW
);
315 pathW
= V_BSTR(&This
->dir
);
316 len
= lstrlenW(pathW
);
317 *pbs
= SysAllocStringLen(pathW
, pathW
[len
- 1] == '\\' ? len
- 1 : len
);
319 if (ret
== S_OK
&& !*pbs
)
324 static HRESULT WINAPI
FolderItemImpl_get_GetLink(FolderItem
*iface
,
327 FIXME("(%p,%p)\n", iface
, ppid
);
333 static HRESULT WINAPI
FolderItemImpl_get_GetFolder(FolderItem
*iface
,
336 FIXME("(%p,%p)\n", iface
, ppid
);
342 static HRESULT WINAPI
FolderItemImpl_get_IsLink(FolderItem
*iface
,
345 FIXME("(%p,%p)\n", iface
, pb
);
350 static HRESULT WINAPI
FolderItemImpl_get_IsFolder(FolderItem
*iface
,
353 FIXME("(%p,%p)\n", iface
, pb
);
358 static HRESULT WINAPI
FolderItemImpl_get_IsFileSystem(FolderItem
*iface
,
361 FIXME("(%p,%p)\n", iface
, pb
);
366 static HRESULT WINAPI
FolderItemImpl_get_IsBrowsable(FolderItem
*iface
,
369 FIXME("(%p,%p)\n", iface
, pb
);
374 static HRESULT WINAPI
FolderItemImpl_get_ModifyDate(FolderItem
*iface
,
377 FIXME("(%p,%p)\n", iface
, pdt
);
382 static HRESULT WINAPI
FolderItemImpl_put_ModifyDate(FolderItem
*iface
, DATE dt
)
384 FIXME("(%p,%f)\n", iface
, dt
);
389 static HRESULT WINAPI
FolderItemImpl_get_Size(FolderItem
*iface
, LONG
*pul
)
391 FIXME("(%p,%p)\n", iface
, pul
);
396 static HRESULT WINAPI
FolderItemImpl_get_Type(FolderItem
*iface
, BSTR
*pbs
)
398 FIXME("(%p,%p)\n", iface
, pbs
);
404 static HRESULT WINAPI
FolderItemImpl_Verbs(FolderItem
*iface
,
405 FolderItemVerbs
**ppfic
)
407 FIXME("(%p,%p)\n", iface
, ppfic
);
413 static HRESULT WINAPI
FolderItemImpl_InvokeVerb(FolderItem
*iface
,
416 FIXME("(%p)\n", iface
);
421 static const FolderItemVtbl FolderItemImpl_Vtbl
= {
422 FolderItemImpl_QueryInterface
,
423 FolderItemImpl_AddRef
,
424 FolderItemImpl_Release
,
425 FolderItemImpl_GetTypeInfoCount
,
426 FolderItemImpl_GetTypeInfo
,
427 FolderItemImpl_GetIDsOfNames
,
428 FolderItemImpl_Invoke
,
429 FolderItemImpl_get_Application
,
430 FolderItemImpl_get_Parent
,
431 FolderItemImpl_get_Name
,
432 FolderItemImpl_put_Name
,
433 FolderItemImpl_get_Path
,
434 FolderItemImpl_get_GetLink
,
435 FolderItemImpl_get_GetFolder
,
436 FolderItemImpl_get_IsLink
,
437 FolderItemImpl_get_IsFolder
,
438 FolderItemImpl_get_IsFileSystem
,
439 FolderItemImpl_get_IsBrowsable
,
440 FolderItemImpl_get_ModifyDate
,
441 FolderItemImpl_put_ModifyDate
,
442 FolderItemImpl_get_Size
,
443 FolderItemImpl_get_Type
,
444 FolderItemImpl_Verbs
,
445 FolderItemImpl_InvokeVerb
448 static HRESULT
FolderItem_Constructor(VARIANT
*dir
, FolderItem
**ppfi
)
450 FolderItemImpl
*This
;
455 This
= HeapAlloc(GetProcessHeap(), 0, sizeof(FolderItemImpl
));
456 if (!This
) return E_OUTOFMEMORY
;
457 This
->FolderItem_iface
.lpVtbl
= &FolderItemImpl_Vtbl
;
460 VariantInit(&This
->dir
);
461 ret
= VariantCopy(&This
->dir
, dir
);
464 HeapFree(GetProcessHeap(), 0, This
);
465 return E_OUTOFMEMORY
;
468 *ppfi
= &This
->FolderItem_iface
;
472 static HRESULT WINAPI
FolderImpl_QueryInterface(Folder3
*iface
, REFIID riid
,
475 FolderImpl
*This
= impl_from_Folder(iface
);
477 TRACE("(%p,%p,%p)\n", iface
, riid
, ppv
);
479 if (!ppv
) return E_INVALIDARG
;
481 if (IsEqualIID(&IID_IUnknown
, riid
) ||
482 IsEqualIID(&IID_IDispatch
, riid
) ||
483 IsEqualIID(&IID_Folder
, riid
) ||
484 IsEqualIID(&IID_Folder2
, riid
) ||
485 IsEqualIID(&IID_Folder3
, riid
))
486 *ppv
= &This
->Folder3_iface
;
489 FIXME("not implemented for %s\n", shdebugstr_guid(riid
));
491 return E_NOINTERFACE
;
493 IUnknown_AddRef((IUnknown
*)*ppv
);
497 static ULONG WINAPI
FolderImpl_AddRef(Folder3
*iface
)
499 FolderImpl
*This
= impl_from_Folder(iface
);
500 ULONG ref
= InterlockedIncrement(&This
->ref
);
502 TRACE("(%p), new refcount=%i\n", iface
, ref
);
507 static ULONG WINAPI
FolderImpl_Release(Folder3
*iface
)
509 FolderImpl
*This
= impl_from_Folder(iface
);
510 ULONG ref
= InterlockedDecrement(&This
->ref
);
512 TRACE("(%p), new refcount=%i\n", iface
, ref
);
516 VariantClear(&This
->dir
);
517 HeapFree(GetProcessHeap(), 0, This
);
522 static HRESULT WINAPI
FolderImpl_GetTypeInfoCount(Folder3
*iface
, UINT
*pctinfo
)
524 TRACE("(%p,%p)\n", iface
, pctinfo
);
530 static HRESULT WINAPI
FolderImpl_GetTypeInfo(Folder3
*iface
, UINT iTInfo
,
531 LCID lcid
, ITypeInfo
**ppTInfo
)
535 TRACE("(%p,%u,%d,%p)\n", iface
, iTInfo
, lcid
, ppTInfo
);
537 hr
= get_typeinfo(Folder3_tid
, ppTInfo
);
539 ITypeInfo_AddRef(*ppTInfo
);
544 static HRESULT WINAPI
FolderImpl_GetIDsOfNames(Folder3
*iface
, REFIID riid
,
545 LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
550 TRACE("(%p,%p,%p,%u,%d,%p)\n", iface
, riid
, rgszNames
, cNames
, lcid
,
553 hr
= get_typeinfo(Folder3_tid
, &ti
);
555 hr
= ITypeInfo_GetIDsOfNames(ti
, rgszNames
, cNames
, rgDispId
);
559 static HRESULT WINAPI
FolderImpl_Invoke(Folder3
*iface
, DISPID dispIdMember
,
560 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
,
561 VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
563 FolderImpl
*This
= impl_from_Folder(iface
);
567 TRACE("(%p,%d,%p,%d,%u,%p,%p,%p,%p)\n", iface
, dispIdMember
, riid
, lcid
,
568 wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
570 hr
= get_typeinfo(Folder3_tid
, &ti
);
572 hr
= ITypeInfo_Invoke(ti
, This
, dispIdMember
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
576 static HRESULT WINAPI
FolderImpl_get_Title(Folder3
*iface
, BSTR
*pbs
)
578 FolderImpl
*This
= impl_from_Folder(iface
);
582 TRACE("(%p,%p)\n", iface
, pbs
);
586 if (V_VT(&This
->dir
) == VT_I4
)
588 FIXME("special folder constants are not supported\n");
591 p
= PathFindFileNameW(V_BSTR(&This
->dir
));
593 *pbs
= SysAllocStringLen(p
, p
[len
- 1] == '\\' ? len
- 1 : len
);
594 return *pbs
? S_OK
: E_OUTOFMEMORY
;
597 static HRESULT WINAPI
FolderImpl_get_Application(Folder3
*iface
,
600 FIXME("(%p,%p)\n", iface
, ppid
);
606 static HRESULT WINAPI
FolderImpl_get_Parent(Folder3
*iface
, IDispatch
**ppid
)
608 FIXME("(%p,%p)\n", iface
, ppid
);
614 static HRESULT WINAPI
FolderImpl_get_ParentFolder(Folder3
*iface
, Folder
**ppsf
)
616 FIXME("(%p,%p)\n", iface
, ppsf
);
622 static HRESULT WINAPI
FolderImpl_Items(Folder3
*iface
, FolderItems
**ppid
)
624 FIXME("(%p,%p)\n", iface
, ppid
);
630 static HRESULT WINAPI
FolderImpl_ParseName(Folder3
*iface
, BSTR bName
,
633 FIXME("(%p,%s,%p)\n", iface
, debugstr_w(bName
), ppid
);
639 static HRESULT WINAPI
FolderImpl_NewFolder(Folder3
*iface
, BSTR bName
,
642 FIXME("(%p,%s)\n", iface
, debugstr_w(bName
));
647 static HRESULT WINAPI
FolderImpl_MoveHere(Folder3
*iface
, VARIANT vItem
,
650 FIXME("(%p)\n", iface
);
655 static HRESULT WINAPI
FolderImpl_CopyHere(Folder3
*iface
, VARIANT vItem
,
658 FIXME("(%p)\n", iface
);
663 static HRESULT WINAPI
FolderImpl_GetDetailsOf(Folder3
*iface
, VARIANT vItem
,
664 int iColumn
, BSTR
*pbs
)
666 FIXME("(%p,%d,%p)\n", iface
, iColumn
, pbs
);
672 static HRESULT WINAPI
FolderImpl_get_Self(Folder3
*iface
, FolderItem
**ppfi
)
674 FolderImpl
*This
= impl_from_Folder(iface
);
676 TRACE("(%p,%p)\n", iface
, ppfi
);
678 return FolderItem_Constructor(&This
->dir
, ppfi
);
681 static HRESULT WINAPI
FolderImpl_get_OfflineStatus(Folder3
*iface
, LONG
*pul
)
683 FIXME("(%p,%p)\n", iface
, pul
);
688 static HRESULT WINAPI
FolderImpl_Synchronize(Folder3
*iface
)
690 FIXME("(%p)\n", iface
);
695 static HRESULT WINAPI
FolderImpl_get_HaveToShowWebViewBarricade(Folder3
*iface
,
696 VARIANT_BOOL
*pbHaveToShowWebViewBarricade
)
698 FIXME("(%p,%p)\n", iface
, pbHaveToShowWebViewBarricade
);
703 static HRESULT WINAPI
FolderImpl_DismissedWebViewBarricade(Folder3
*iface
)
705 FIXME("(%p)\n", iface
);
710 static HRESULT WINAPI
FolderImpl_get_ShowWebViewBarricade(Folder3
*iface
,
711 VARIANT_BOOL
*pbShowWebViewBarricade
)
713 FIXME("(%p,%p)\n", iface
, pbShowWebViewBarricade
);
718 static HRESULT WINAPI
FolderImpl_put_ShowWebViewBarricade(Folder3
*iface
,
719 VARIANT_BOOL bShowWebViewBarricade
)
721 FIXME("(%p,%d)\n", iface
, bShowWebViewBarricade
);
726 static const Folder3Vtbl FolderImpl_Vtbl
= {
727 FolderImpl_QueryInterface
,
730 FolderImpl_GetTypeInfoCount
,
731 FolderImpl_GetTypeInfo
,
732 FolderImpl_GetIDsOfNames
,
734 FolderImpl_get_Title
,
735 FolderImpl_get_Application
,
736 FolderImpl_get_Parent
,
737 FolderImpl_get_ParentFolder
,
739 FolderImpl_ParseName
,
740 FolderImpl_NewFolder
,
743 FolderImpl_GetDetailsOf
,
745 FolderImpl_get_OfflineStatus
,
746 FolderImpl_Synchronize
,
747 FolderImpl_get_HaveToShowWebViewBarricade
,
748 FolderImpl_DismissedWebViewBarricade
,
749 FolderImpl_get_ShowWebViewBarricade
,
750 FolderImpl_put_ShowWebViewBarricade
753 static HRESULT
Folder_Constructor(VARIANT
*dir
, Folder
**ppsdf
)
763 /* FIXME: add some checks */
766 if (PathIsDirectoryW(V_BSTR(dir
)) &&
767 !PathIsRelativeW(V_BSTR(dir
)) &&
768 PathFileExistsW(V_BSTR(dir
)))
774 This
= HeapAlloc(GetProcessHeap(), 0, sizeof(FolderImpl
));
775 if (!This
) return E_OUTOFMEMORY
;
776 This
->Folder3_iface
.lpVtbl
= &FolderImpl_Vtbl
;
779 VariantInit(&This
->dir
);
780 ret
= VariantCopy(&This
->dir
, dir
);
783 HeapFree(GetProcessHeap(), 0, This
);
784 return E_OUTOFMEMORY
;
787 *ppsdf
= (Folder
*)This
;
791 static HRESULT WINAPI
ShellDispatch_QueryInterface(IShellDispatch5
*iface
,
792 REFIID riid
, LPVOID
*ppv
)
794 ShellDispatch
*This
= impl_from_IShellDispatch5(iface
);
796 TRACE("(%p,%p,%p)\n", iface
, riid
, ppv
);
798 if (!ppv
) return E_INVALIDARG
;
800 if (IsEqualIID(&IID_IUnknown
, riid
) ||
801 IsEqualIID(&IID_IDispatch
, riid
) ||
802 IsEqualIID(&IID_IShellDispatch
, riid
) ||
803 IsEqualIID(&IID_IShellDispatch2
, riid
) ||
804 IsEqualIID(&IID_IShellDispatch3
, riid
) ||
805 IsEqualIID(&IID_IShellDispatch4
, riid
) ||
806 IsEqualIID(&IID_IShellDispatch5
, riid
))
807 *ppv
= &This
->IShellDispatch5_iface
;
810 FIXME("not implemented for %s\n", shdebugstr_guid(riid
));
812 return E_NOINTERFACE
;
815 IShellDispatch5_AddRef(iface
);
819 static ULONG WINAPI
ShellDispatch_AddRef(IShellDispatch5
*iface
)
821 ShellDispatch
*This
= impl_from_IShellDispatch5(iface
);
822 ULONG ref
= InterlockedIncrement(&This
->ref
);
824 TRACE("(%p), new refcount=%i\n", iface
, ref
);
829 static ULONG WINAPI
ShellDispatch_Release(IShellDispatch5
*iface
)
831 ShellDispatch
*This
= impl_from_IShellDispatch5(iface
);
832 ULONG ref
= InterlockedDecrement(&This
->ref
);
834 TRACE("(%p), new refcount=%i\n", iface
, ref
);
837 HeapFree(GetProcessHeap(), 0, This
);
842 static HRESULT WINAPI
ShellDispatch_GetTypeInfoCount(IShellDispatch5
*iface
,
845 TRACE("(%p,%p)\n", iface
, pctinfo
);
851 static HRESULT WINAPI
ShellDispatch_GetTypeInfo(IShellDispatch5
*iface
,
852 UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
856 TRACE("(%p,%u,%d,%p)\n", iface
, iTInfo
, lcid
, ppTInfo
);
858 hr
= get_typeinfo(IShellDispatch5_tid
, ppTInfo
);
860 ITypeInfo_AddRef(*ppTInfo
);
864 static HRESULT WINAPI
ShellDispatch_GetIDsOfNames(IShellDispatch5
*iface
,
865 REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
870 TRACE("(%p,%p,%p,%u,%d,%p)\n", iface
, riid
, rgszNames
, cNames
, lcid
,
873 hr
= get_typeinfo(IShellDispatch5_tid
, &ti
);
875 hr
= ITypeInfo_GetIDsOfNames(ti
, rgszNames
, cNames
, rgDispId
);
879 static HRESULT WINAPI
ShellDispatch_Invoke(IShellDispatch5
*iface
,
880 DISPID dispIdMember
, REFIID riid
, LCID lcid
, WORD wFlags
,
881 DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
,
884 ShellDispatch
*This
= impl_from_IShellDispatch5(iface
);
888 TRACE("(%p,%d,%p,%d,%u,%p,%p,%p,%p)\n", iface
, dispIdMember
, riid
, lcid
,
889 wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
891 hr
= get_typeinfo(IShellDispatch5_tid
, &ti
);
893 hr
= ITypeInfo_Invoke(ti
, This
, dispIdMember
, wFlags
, pDispParams
,
894 pVarResult
, pExcepInfo
, puArgErr
);
898 static HRESULT WINAPI
ShellDispatch_get_Application(IShellDispatch5
*iface
,
901 FIXME("(%p,%p)\n", iface
, ppid
);
907 static HRESULT WINAPI
ShellDispatch_get_Parent(IShellDispatch5
*iface
,
910 FIXME("(%p,%p)\n", iface
, ppid
);
916 static HRESULT WINAPI
ShellDispatch_NameSpace(IShellDispatch5
*iface
,
917 VARIANT vDir
, Folder
**ppsdf
)
919 TRACE("(%p,%p)\n", iface
, ppsdf
);
921 return Folder_Constructor(&vDir
, ppsdf
);
924 static HRESULT WINAPI
ShellDispatch_BrowseForFolder(IShellDispatch5
*iface
,
925 LONG Hwnd
, BSTR Title
, LONG Options
, VARIANT RootFolder
, Folder
**ppsdf
)
927 FIXME("(%p,%x,%s,%x,%p)\n", iface
, Hwnd
, debugstr_w(Title
), Options
, ppsdf
);
933 static HRESULT WINAPI
ShellDispatch_Windows(IShellDispatch5
*iface
,
936 FIXME("(%p,%p)\n", iface
, ppid
);
942 static HRESULT WINAPI
ShellDispatch_Open(IShellDispatch5
*iface
, VARIANT vDir
)
944 FIXME("(%p)\n", iface
);
949 static HRESULT WINAPI
ShellDispatch_Explore(IShellDispatch5
*iface
, VARIANT vDir
)
951 FIXME("(%p)\n", iface
);
956 static HRESULT WINAPI
ShellDispatch_MinimizeAll(IShellDispatch5
*iface
)
958 FIXME("(%p)\n", iface
);
963 static HRESULT WINAPI
ShellDispatch_UndoMinimizeALL(IShellDispatch5
*iface
)
965 FIXME("(%p)\n", iface
);
970 static HRESULT WINAPI
ShellDispatch_FileRun(IShellDispatch5
*iface
)
972 FIXME("(%p)\n", iface
);
977 static HRESULT WINAPI
ShellDispatch_CascadeWindows(IShellDispatch5
*iface
)
979 FIXME("(%p)\n", iface
);
984 static HRESULT WINAPI
ShellDispatch_TileVertically(IShellDispatch5
*iface
)
986 FIXME("(%p)\n", iface
);
991 static HRESULT WINAPI
ShellDispatch_TileHorizontally(IShellDispatch5
*iface
)
993 FIXME("(%p)\n", iface
);
998 static HRESULT WINAPI
ShellDispatch_ShutdownWindows(IShellDispatch5
*iface
)
1000 FIXME("(%p)\n", iface
);
1005 static HRESULT WINAPI
ShellDispatch_Suspend(IShellDispatch5
*iface
)
1007 FIXME("(%p)\n", iface
);
1012 static HRESULT WINAPI
ShellDispatch_EjectPC(IShellDispatch5
*iface
)
1014 FIXME("(%p)\n", iface
);
1019 static HRESULT WINAPI
ShellDispatch_SetTime(IShellDispatch5
*iface
)
1021 FIXME("(%p)\n", iface
);
1026 static HRESULT WINAPI
ShellDispatch_TrayProperties(IShellDispatch5
*iface
)
1028 FIXME("(%p)\n", iface
);
1033 static HRESULT WINAPI
ShellDispatch_Help(IShellDispatch5
*iface
)
1035 FIXME("(%p)\n", iface
);
1040 static HRESULT WINAPI
ShellDispatch_FindFiles(IShellDispatch5
*iface
)
1042 FIXME("(%p)\n", iface
);
1047 static HRESULT WINAPI
ShellDispatch_FindComputer(IShellDispatch5
*iface
)
1049 FIXME("(%p)\n", iface
);
1054 static HRESULT WINAPI
ShellDispatch_RefreshMenu(IShellDispatch5
*iface
)
1056 FIXME("(%p)\n", iface
);
1061 static HRESULT WINAPI
ShellDispatch_ControlPanelItem(IShellDispatch5
*iface
,
1064 FIXME("(%p,%s)\n", iface
, debugstr_w(szDir
));
1069 static HRESULT WINAPI
ShellDispatch_IsRestricted(IShellDispatch5
*iface
, BSTR group
, BSTR restriction
, LONG
*value
)
1071 FIXME("(%s, %s, %p): stub\n", debugstr_w(group
), debugstr_w(restriction
), value
);
1075 static HRESULT WINAPI
ShellDispatch_ShellExecute(IShellDispatch5
*iface
, BSTR file
, VARIANT args
, VARIANT dir
,
1076 VARIANT op
, VARIANT show
)
1078 FIXME("(%s): stub\n", debugstr_w(file
));
1082 static HRESULT WINAPI
ShellDispatch_FindPrinter(IShellDispatch5
*iface
, BSTR name
, BSTR location
, BSTR model
)
1084 FIXME("(%s, %s, %s): stub\n", debugstr_w(name
), debugstr_w(location
), debugstr_w(model
));
1088 static HRESULT WINAPI
ShellDispatch_GetSystemInformation(IShellDispatch5
*iface
, BSTR name
, VARIANT
*ret
)
1090 FIXME("(%s, %p): stub\n", debugstr_w(name
), ret
);
1094 static HRESULT WINAPI
ShellDispatch_ServiceStart(IShellDispatch5
*iface
, BSTR service
, VARIANT persistent
, VARIANT
*ret
)
1096 FIXME("(%s, %p): stub\n", debugstr_w(service
), ret
);
1100 static HRESULT WINAPI
ShellDispatch_ServiceStop(IShellDispatch5
*iface
, BSTR service
, VARIANT persistent
, VARIANT
*ret
)
1102 FIXME("(%s, %p): stub\n", debugstr_w(service
), ret
);
1106 static HRESULT WINAPI
ShellDispatch_IsServiceRunning(IShellDispatch5
*iface
, BSTR name
, VARIANT
*running
)
1108 SERVICE_STATUS_PROCESS status
;
1109 SC_HANDLE scm
, service
;
1112 TRACE("(%s, %p)\n", debugstr_w(name
), running
);
1114 V_VT(running
) = VT_BOOL
;
1115 V_BOOL(running
) = VARIANT_FALSE
;
1117 scm
= OpenSCManagerW(NULL
, NULL
, SC_MANAGER_CONNECT
);
1120 ERR("failed to connect to service manager\n");
1124 service
= OpenServiceW(scm
, name
, SERVICE_QUERY_STATUS
);
1127 ERR("Failed to open service %s (%u)\n", debugstr_w(name
), GetLastError());
1128 CloseServiceHandle(scm
);
1132 if (!QueryServiceStatusEx(service
, SC_STATUS_PROCESS_INFO
, (BYTE
*)&status
,
1133 sizeof(SERVICE_STATUS_PROCESS
), &dummy
))
1135 TRACE("failed to query service status (%u)\n", GetLastError());
1136 CloseServiceHandle(service
);
1137 CloseServiceHandle(scm
);
1141 if (status
.dwCurrentState
== SERVICE_RUNNING
)
1142 V_BOOL(running
) = VARIANT_TRUE
;
1144 CloseServiceHandle(service
);
1145 CloseServiceHandle(scm
);
1150 static HRESULT WINAPI
ShellDispatch_CanStartStopService(IShellDispatch5
*iface
, BSTR service
, VARIANT
*ret
)
1152 FIXME("(%s, %p): stub\n", debugstr_w(service
), ret
);
1156 static HRESULT WINAPI
ShellDispatch_ShowBrowserBar(IShellDispatch5
*iface
, BSTR clsid
, VARIANT show
, VARIANT
*ret
)
1158 FIXME("(%s, %p): stub\n", debugstr_w(clsid
), ret
);
1162 static HRESULT WINAPI
ShellDispatch_AddToRecent(IShellDispatch5
*iface
, VARIANT file
, BSTR category
)
1164 FIXME("(%s): stub\n", debugstr_w(category
));
1168 static HRESULT WINAPI
ShellDispatch_WindowsSecurity(IShellDispatch5
*iface
)
1174 static HRESULT WINAPI
ShellDispatch_ToggleDesktop(IShellDispatch5
*iface
)
1180 static HRESULT WINAPI
ShellDispatch_ExplorerPolicy(IShellDispatch5
*iface
, BSTR policy
, VARIANT
*value
)
1182 FIXME("(%s, %p): stub\n", debugstr_w(policy
), value
);
1186 static HRESULT WINAPI
ShellDispatch_GetSetting(IShellDispatch5
*iface
, LONG setting
, VARIANT_BOOL
*result
)
1188 FIXME("(%d %p): stub\n", setting
, result
);
1192 static HRESULT WINAPI
ShellDispatch_WindowSwitcher(IShellDispatch5
*iface
)
1198 static const IShellDispatch5Vtbl ShellDispatch5Vtbl
= {
1199 ShellDispatch_QueryInterface
,
1200 ShellDispatch_AddRef
,
1201 ShellDispatch_Release
,
1202 ShellDispatch_GetTypeInfoCount
,
1203 ShellDispatch_GetTypeInfo
,
1204 ShellDispatch_GetIDsOfNames
,
1205 ShellDispatch_Invoke
,
1206 ShellDispatch_get_Application
,
1207 ShellDispatch_get_Parent
,
1208 ShellDispatch_NameSpace
,
1209 ShellDispatch_BrowseForFolder
,
1210 ShellDispatch_Windows
,
1212 ShellDispatch_Explore
,
1213 ShellDispatch_MinimizeAll
,
1214 ShellDispatch_UndoMinimizeALL
,
1215 ShellDispatch_FileRun
,
1216 ShellDispatch_CascadeWindows
,
1217 ShellDispatch_TileVertically
,
1218 ShellDispatch_TileHorizontally
,
1219 ShellDispatch_ShutdownWindows
,
1220 ShellDispatch_Suspend
,
1221 ShellDispatch_EjectPC
,
1222 ShellDispatch_SetTime
,
1223 ShellDispatch_TrayProperties
,
1225 ShellDispatch_FindFiles
,
1226 ShellDispatch_FindComputer
,
1227 ShellDispatch_RefreshMenu
,
1228 ShellDispatch_ControlPanelItem
,
1229 ShellDispatch_IsRestricted
,
1230 ShellDispatch_ShellExecute
,
1231 ShellDispatch_FindPrinter
,
1232 ShellDispatch_GetSystemInformation
,
1233 ShellDispatch_ServiceStart
,
1234 ShellDispatch_ServiceStop
,
1235 ShellDispatch_IsServiceRunning
,
1236 ShellDispatch_CanStartStopService
,
1237 ShellDispatch_ShowBrowserBar
,
1238 ShellDispatch_AddToRecent
,
1239 ShellDispatch_WindowsSecurity
,
1240 ShellDispatch_ToggleDesktop
,
1241 ShellDispatch_ExplorerPolicy
,
1242 ShellDispatch_GetSetting
,
1243 ShellDispatch_WindowSwitcher
1246 HRESULT WINAPI
IShellDispatch_Constructor(IUnknown
*outer
, REFIID riid
, void **ppv
)
1248 ShellDispatch
*This
;
1251 TRACE("(%p, %s)\n", outer
, debugstr_guid(riid
));
1255 if (outer
) return CLASS_E_NOAGGREGATION
;
1257 This
= HeapAlloc(GetProcessHeap(), 0, sizeof(ShellDispatch
));
1258 if (!This
) return E_OUTOFMEMORY
;
1259 This
->IShellDispatch5_iface
.lpVtbl
= &ShellDispatch5Vtbl
;
1262 ret
= IShellDispatch5_QueryInterface(&This
->IShellDispatch5_iface
, riid
, ppv
);
1263 IShellDispatch5_Release(&This
->IShellDispatch5_iface
);