From: Nikolay Sivov Subject: shell32: Added a stub for SHAssocEnumHandlers() Message-Id: <54818990.70005@codeweavers.com> Date: Fri, 05 Dec 2014 13:31:44 +0300 --- From fe92b7e9b430f576ca7a59dffcc205fdaf8241e7 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Fri, 5 Dec 2014 13:30:08 +0300 Subject: [PATCH] shell32: Added a stub for SHAssocEnumHandlers() --- dlls/shell32/assoc.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++ dlls/shell32/shell32.spec | 1 + 2 files changed, 91 insertions(+) diff --git a/dlls/shell32/assoc.c b/dlls/shell32/assoc.c index b0d815a..39e210d 100644 --- a/dlls/shell32/assoc.c +++ b/dlls/shell32/assoc.c @@ -77,6 +77,17 @@ static inline IQueryAssociationsImpl *impl_from_IQueryAssociations(IQueryAssocia return CONTAINING_RECORD(iface, IQueryAssociationsImpl, IQueryAssociations_iface); } +struct enumassochandlers +{ + IEnumAssocHandlers IEnumAssocHandlers_iface; + LONG ref; +}; + +static inline struct enumassochandlers *impl_from_IEnumAssocHandlers(IEnumAssocHandlers *iface) +{ + return CONTAINING_RECORD(iface, struct enumassochandlers, IEnumAssocHandlers_iface); +} + /************************************************************************** * IQueryAssociations_QueryInterface * @@ -965,3 +976,82 @@ HRESULT WINAPI ApplicationAssociationRegistration_Constructor(IUnknown *outer, R TRACE("returning 0x%x with %p\n", hr, *ppv); return hr; } + +static HRESULT WINAPI enumassochandlers_QueryInterface(IEnumAssocHandlers *iface, REFIID riid, void **obj) +{ + struct enumassochandlers *This = impl_from_IEnumAssocHandlers(iface); + + TRACE("(%p %s %p)\n", This, debugstr_guid(riid), obj); + + if (IsEqualIID(riid, &IID_IEnumAssocHandlers) || + IsEqualIID(riid, &IID_IUnknown)) + { + *obj = iface; + IEnumAssocHandlers_AddRef(iface); + return S_OK; + } + + *obj = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI enumassochandlers_AddRef(IEnumAssocHandlers *iface) +{ + struct enumassochandlers *This = impl_from_IEnumAssocHandlers(iface); + ULONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p)->(%u)\n", This, ref); + return ref; +} + +static ULONG WINAPI enumassochandlers_Release(IEnumAssocHandlers *iface) +{ + struct enumassochandlers *This = impl_from_IEnumAssocHandlers(iface); + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p)->(%u)\n", This, ref); + + if (!ref) + SHFree(This); + + return ref; +} + +static HRESULT WINAPI enumassochandlers_Next(IEnumAssocHandlers *iface, ULONG count, IAssocHandler **handlers, + ULONG *fetched) +{ + struct enumassochandlers *This = impl_from_IEnumAssocHandlers(iface); + + FIXME("(%p)->(%u %p %p): stub\n", This, count, handlers, fetched); + + return E_NOTIMPL; +} + +static const IEnumAssocHandlersVtbl enumassochandlersvtbl = { + enumassochandlers_QueryInterface, + enumassochandlers_AddRef, + enumassochandlers_Release, + enumassochandlers_Next +}; + +/************************************************************************** + * SHAssocEnumHandlers [SHELL32.@] + */ +HRESULT WINAPI SHAssocEnumHandlers(const WCHAR *extra, ASSOC_FILTER filter, IEnumAssocHandlers **enumhandlers) +{ + struct enumassochandlers *enumassoc; + + FIXME("(%s %d %p\n): stub", debugstr_w(extra), filter, enumhandlers); + + *enumhandlers = NULL; + + enumassoc = SHAlloc(sizeof(*enumassoc)); + if (!enumassoc) + return E_OUTOFMEMORY; + + enumassoc->IEnumAssocHandlers_iface.lpVtbl = &enumassochandlersvtbl; + enumassoc->ref = 1; + + *enumhandlers = &enumassoc->IEnumAssocHandlers_iface; + return S_OK; +} diff --git a/dlls/shell32/shell32.spec b/dlls/shell32/shell32.spec index e6858c8..0a8d448 100644 --- a/dlls/shell32/shell32.spec +++ b/dlls/shell32/shell32.spec @@ -328,6 +328,7 @@ @ stdcall SetCurrentProcessExplicitAppUserModelID(wstr) @ stdcall SHAddToRecentDocs (long ptr) @ stdcall SHAppBarMessage(long ptr) +@ stdcall SHAssocEnumHandlers(wstr long ptr) @ stdcall SHBindToParent(ptr ptr ptr ptr) @ stdcall SHBrowseForFolder(ptr) SHBrowseForFolderA @ stdcall SHBrowseForFolderA(ptr) -- 2.1.3