From 095860df576dcb4c7d4faf9f7184734cc6c9fe67 Mon Sep 17 00:00:00 2001 From: Justin Miller Date: Tue, 21 Jul 2026 19:11:29 +0000 Subject: [PATCH] [SDK][SHELL32] A big bundle of NT6+ shell32 implementations and stubs (#8834) Split off CShellitemArray stub out CShellLibrary stub out CUserEventTimer rewrite some vista shellitem APIs Misc stubs for vista AddITaskbarList3/ITaskbarList4 --------- Co-authored-by: Oleb Dubinskiy Co-authored-by: Mikhail Tyukin --- dll/win32/browseui/CTaskbarList.cpp | 91 +++++ dll/win32/browseui/CTaskbarList.h | 21 +- dll/win32/shell32/CMakeLists.txt | 5 + dll/win32/shell32/CShellItem.cpp | 364 +++++++++++++++---- dll/win32/shell32/CShellItemArray.cpp | 353 ++++++++++++++++++ dll/win32/shell32/CShellItemArray.h | 35 ++ dll/win32/shell32/CShellLibrary.cpp | 126 +++++++ dll/win32/shell32/CShellLibrary.h | 50 +++ dll/win32/shell32/CSimpleShellItemArray.h | 35 ++ dll/win32/shell32/CUserEventTimer.cpp | 56 +++ dll/win32/shell32/CUserEventTimer.h | 40 ++ dll/win32/shell32/precomp.h | 4 + dll/win32/shell32/res/rgs/shelllibrary.rgs | 13 + dll/win32/shell32/res/rgs/usereventtimer.rgs | 13 + dll/win32/shell32/rgs_res.rc | 2 + dll/win32/shell32/shell32.cpp | 2 + dll/win32/shell32/shell32.spec | 47 ++- dll/win32/shell32/shresdef.h | 2 + dll/win32/shell32/stubs.cpp | 59 +++ dll/win32/shell32/wine/pidl.c | 2 + dll/win32/shell32/wine/shell32_main.h | 3 + dll/win32/shell32/wine/shellpath.c | 1 + sdk/include/psdk/shellapi.h | 16 + sdk/include/psdk/shlguid.h | 4 + sdk/include/psdk/shobjidl.idl | 162 ++++++++- 25 files changed, 1414 insertions(+), 92 deletions(-) create mode 100644 dll/win32/shell32/CShellItemArray.cpp create mode 100644 dll/win32/shell32/CShellItemArray.h create mode 100644 dll/win32/shell32/CShellLibrary.cpp create mode 100644 dll/win32/shell32/CShellLibrary.h create mode 100644 dll/win32/shell32/CSimpleShellItemArray.h create mode 100644 dll/win32/shell32/CUserEventTimer.cpp create mode 100644 dll/win32/shell32/CUserEventTimer.h create mode 100644 dll/win32/shell32/res/rgs/shelllibrary.rgs create mode 100644 dll/win32/shell32/res/rgs/usereventtimer.rgs diff --git a/dll/win32/browseui/CTaskbarList.cpp b/dll/win32/browseui/CTaskbarList.cpp index 24f6f34b997..3e6fc7309b0 100644 --- a/dll/win32/browseui/CTaskbarList.cpp +++ b/dll/win32/browseui/CTaskbarList.cpp @@ -45,6 +45,97 @@ void CTaskbarList::SendTaskWndShellHook(WPARAM wParam, HWND hWnd) ::SendMessageW(hTaskWnd, m_ShellHookMsg, wParam, (LPARAM)hWnd); } +/*********************************************************************** + * ITaskbarList4 implementation + */ +HRESULT WINAPI CTaskbarList::SetTabProperties(HWND hwnd, STPFLAG stpFlags) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + + +/*********************************************************************** + * ITaskbarList3 implementation + */ + +HRESULT WINAPI CTaskbarList::SetProgressValue(HWND hwnd, ULONGLONG ullCompleted, ULONGLONG ullTotal) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT WINAPI CTaskbarList::SetProgressState(HWND hwnd, TBPFLAG tbpFlags) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT WINAPI CTaskbarList::RegisterTab(HWND hwnd, HWND hwndMDI) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT WINAPI CTaskbarList::UnregisterTab(HWND hwndTab) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT WINAPI CTaskbarList::SetTabOrder(HWND hwndTab, HWND hwndInsertBefore) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + + +HRESULT WINAPI CTaskbarList::SetTabActive(HWND hwndTab, HWND hwndMDI, DWORD dwReserved) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT WINAPI CTaskbarList::ThumbBarAddButtons(HWND hwnd, UINT cButtons, LPTHUMBBUTTON pButton) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT WINAPI CTaskbarList::ThumbBarUpdateButtons(HWND hwnd, UINT cButtons, LPTHUMBBUTTON pButton) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT WINAPI CTaskbarList::ThumbBarSetImageList(HWND hwnd, HIMAGELIST himl) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT WINAPI CTaskbarList::SetOverlayIcon(HWND hwnd, HICON hIcon, LPCWSTR pszDescription) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT WINAPI CTaskbarList::SetThumbnailTooltip(HWND hwnd, LPCWSTR pszTip) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT WINAPI CTaskbarList::SetThumbnailClip(HWND hwnd, RECT* prcClip) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +/*********************************************************************** + * ITaskbarList2 implementation + */ + HRESULT WINAPI CTaskbarList::MarkFullscreenWindow(HWND hwnd, BOOL fFullscreen) { diff --git a/dll/win32/browseui/CTaskbarList.h b/dll/win32/browseui/CTaskbarList.h index 8975e0a3cb8..ff925de71dc 100644 --- a/dll/win32/browseui/CTaskbarList.h +++ b/dll/win32/browseui/CTaskbarList.h @@ -11,7 +11,7 @@ class CTaskbarList : public CComCoClass, public CComObjectRootEx, - public ITaskbarList2 + public ITaskbarList4 { HWND m_hTaskWnd; UINT m_ShellHookMsg; @@ -23,6 +23,23 @@ public: CTaskbarList(); virtual ~CTaskbarList(); + /*** ITaskbarList4 methods ***/ + STDMETHOD(SetTabProperties)(HWND hwnd, STPFLAG stpFlags) override; + + /*** ITaskbarList3 methods ***/ + STDMETHOD(SetProgressValue)(HWND hwnd, ULONGLONG ullCompleted, ULONGLONG ullTotal) override; + STDMETHOD(SetProgressState)(HWND hwnd, TBPFLAG tbpFlags) override; + STDMETHOD(RegisterTab)(HWND hwnd, HWND hwndMDI) override; + STDMETHOD(UnregisterTab)(HWND hwndTab) override; + STDMETHOD(SetTabOrder)(HWND hwndTab, HWND hwndInsertBefore) override; + STDMETHOD(SetTabActive)(HWND hwndTab, HWND hwndMDI, DWORD dwReserved) override; + STDMETHOD(ThumbBarAddButtons)(HWND hwnd, UINT cButtons, LPTHUMBBUTTON pButton) override; + STDMETHOD(ThumbBarUpdateButtons)(HWND hwnd, UINT cButtons, LPTHUMBBUTTON pButton) override; + STDMETHOD(ThumbBarSetImageList)(HWND hwnd, HIMAGELIST himl) override; + STDMETHOD(SetOverlayIcon)(HWND hwnd, HICON hIcon, LPCWSTR pszDescription) override; + STDMETHOD(SetThumbnailTooltip)(HWND hwnd, LPCWSTR pszTip) override; + STDMETHOD(SetThumbnailClip)(HWND hwnd, RECT* prcClip) override; + /*** ITaskbarList2 methods ***/ STDMETHOD(MarkFullscreenWindow)(HWND hwnd, BOOL fFullscreen) override; @@ -39,6 +56,8 @@ public: DECLARE_PROTECT_FINAL_CONSTRUCT() BEGIN_COM_MAP(CTaskbarList) + COM_INTERFACE_ENTRY_IID(IID_ITaskbarList4, ITaskbarList4) + COM_INTERFACE_ENTRY_IID(IID_ITaskbarList3, ITaskbarList3) COM_INTERFACE_ENTRY_IID(IID_ITaskbarList2, ITaskbarList2) COM_INTERFACE_ENTRY_IID(IID_ITaskbarList, ITaskbarList) END_COM_MAP() diff --git a/dll/win32/shell32/CMakeLists.txt b/dll/win32/shell32/CMakeLists.txt index d2d3dd6d42e..d143feb6958 100644 --- a/dll/win32/shell32/CMakeLists.txt +++ b/dll/win32/shell32/CMakeLists.txt @@ -46,6 +46,7 @@ list(APPEND SOURCE shell32.cpp utils.cpp CShellItem.cpp + CShellItemArray.cpp CShellLink.cpp CFolderOptions.cpp folders/CDesktopFolder.cpp @@ -75,6 +76,8 @@ list(APPEND SOURCE CDefViewBckgrndMenu.cpp stubs.cpp systray.cpp + CUserEventTimer.cpp + CUserEventTimer.h CUserNotification.cpp CDefaultContextMenu.cpp COpenWithMenu.cpp @@ -83,6 +86,8 @@ list(APPEND SOURCE CCopyMoveToMenu.cpp CCopyAsPathMenu.cpp CShellDispatch.cpp + CShellLibrary.cpp + CShellLibrary.h CFolder.cpp CFolderItems.cpp CFolderItemVerbs.cpp) diff --git a/dll/win32/shell32/CShellItem.cpp b/dll/win32/shell32/CShellItem.cpp index de43586cdb6..72f0923d952 100644 --- a/dll/win32/shell32/CShellItem.cpp +++ b/dll/win32/shell32/CShellItem.cpp @@ -24,9 +24,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell); -EXTERN_C HRESULT WINAPI SHCreateShellItem(PCIDLIST_ABSOLUTE pidlParent, - IShellFolder *psfParent, PCUITEMID_CHILD pidl, IShellItem **ppsi); - CShellItem::CShellItem() : m_pidl(NULL) { @@ -336,97 +333,308 @@ HRESULT WINAPI SHCreateShellItem(PCIDLIST_ABSOLUTE pidlParent, return hr; } -class CShellItemArray : - public CComCoClass, - public CComObjectRootEx, - public IShellItemArray +/*********************************************************************** + * SHCreateItemFromIDList [SHELL32.@] + */ +EXTERN_C HRESULT WINAPI +SHCreateItemFromIDList(_In_ PCIDLIST_ABSOLUTE pidl, _In_ REFIID riid, _Out_ void **ppv) { - CIDA *m_pCIDA; - STGMEDIUM m_Medium; + CComPtr item; + HRESULT hr; -public: - CShellItemArray() : m_pCIDA(NULL) + TRACE("(%p,%s,%p)\n", pidl, debugstr_guid(&riid), ppv); + + if (!ppv) + return E_POINTER; + *ppv = NULL; + + if (!pidl) + return E_INVALIDARG; + + hr = SHCreateShellItem(NULL, NULL, pidl, &item); + if (FAILED_UNEXPECTEDLY(hr)) + return hr; + + return item->QueryInterface(riid, ppv); +} + +/*********************************************************************** + * SHCreateItemFromParsingName [SHELL32.@] + */ +EXTERN_C HRESULT WINAPI +SHCreateItemFromParsingName( + _In_ PCWSTR pszPath, + _In_opt_ IBindCtx *pbc, + _In_ REFIID riid, + _Out_ void **ppv) +{ + CComHeapPtr pidl; + HRESULT hr; + + TRACE("(%s,%p,%s,%p)\n", debugstr_w(pszPath), pbc, debugstr_guid(&riid), ppv); + + if (!ppv) + return E_POINTER; + *ppv = NULL; + + hr = SHParseDisplayName(pszPath, pbc, &pidl, 0, NULL); + if (SUCCEEDED(hr)) + hr = SHCreateItemFromIDList(pidl, riid, ppv); + + return hr; +} + +/*********************************************************************** + * SHGetItemFromDataObject [SHELL32.@] + */ +EXTERN_C HRESULT WINAPI +SHGetItemFromDataObject( + _In_ IDataObject *pdtobj, + _In_ DATAOBJ_GET_ITEM_FLAGS dwFlags, + _In_ REFIID riid, + _Out_ void **ppv) +{ + FORMATETC fmt; + STGMEDIUM medium = { 0 }; + HRESULT hr; + + TRACE("(%p,%x,%s,%p)\n", pdtobj, dwFlags, debugstr_guid(&riid), ppv); + + if (!pdtobj) + return E_INVALIDARG; + + fmt.cfFormat = (CLIPFORMAT)RegisterClipboardFormatW(CFSTR_SHELLIDLISTW); + fmt.ptd = NULL; + fmt.dwAspect = DVASPECT_CONTENT; + fmt.lindex = -1; + fmt.tymed = TYMED_HGLOBAL; + + hr = pdtobj->GetData(&fmt, &medium); + if (SUCCEEDED(hr)) { - m_Medium.tymed = TYMED_NULL; + LPIDA pida = (LPIDA)GlobalLock(medium.hGlobal); + if (pida && pida->cidl >= 1 && + ((pida->cidl > 1 && !(dwFlags & DOGIF_ONLY_IF_ONE)) || pida->cidl == 1)) + { + LPITEMIDLIST pidl = ILCombine(HIDA_GetPIDLFolder(pida), + HIDA_GetPIDLItem(pida, 0)); + if (pidl) + { + hr = SHCreateItemFromIDList(pidl, riid, ppv); + ILFree(pidl); + } + else + { + hr = E_OUTOFMEMORY; + } + } + else + { + TRACE("Failed to create item, cidl=%u, dwFlags=%#x\n", pida ? pida->cidl : 0, dwFlags); + hr = E_FAIL; + } + + if (medium.hGlobal) + { + GlobalUnlock(medium.hGlobal); + ReleaseStgMedium(&medium); + } } - virtual ~CShellItemArray() + if (FAILED(hr) && !(dwFlags & DOGIF_NO_HDROP)) { - CDataObjectHIDA::DestroyCIDA(m_pCIDA, m_Medium); + TRACE("Attempting to fall back on CF_HDROP.\n"); + + fmt.cfFormat = CF_HDROP; + fmt.ptd = NULL; + fmt.dwAspect = DVASPECT_CONTENT; + fmt.lindex = -1; + fmt.tymed = TYMED_HGLOBAL; + ZeroMemory(&medium, sizeof(medium)); + + hr = pdtobj->GetData(&fmt, &medium); + if (SUCCEEDED(hr)) + { + DROPFILES *df = (DROPFILES *)GlobalLock(medium.hGlobal); + hr = E_FAIL; + if (df) + { + LPBYTE files = (LPBYTE)df + df->pFiles; + if (!df->fWide) + { + PCSTR first = (PCSTR)files; + BOOL multi = *(first + lstrlenA(first) + 1) != 0; + if (!(multi && (dwFlags & DOGIF_ONLY_IF_ONE))) + { + WCHAR filename[MAX_PATH]; + MultiByteToWideChar(CP_ACP, 0, first, -1, filename, _countof(filename)); + hr = SHCreateItemFromParsingName(filename, NULL, riid, ppv); + } + } + else + { + PCWSTR first = (PCWSTR)files; + BOOL multi = *(first + lstrlenW(first) + 1) != 0; + if (!(multi && (dwFlags & DOGIF_ONLY_IF_ONE))) + hr = SHCreateItemFromParsingName(first, NULL, riid, ppv); + } + GlobalUnlock(medium.hGlobal); + } + ReleaseStgMedium(&medium); + } } - HRESULT Initialize(IDataObject *pdo) + if (FAILED(hr) && !(dwFlags & DOGIF_NO_URL)) + FIXME("Failed to create item, should try CF_URL.\n"); + + return hr; +} + +#if DLL_EXPORT_VERSION >= _WIN32_WINNT_VISTA + +/*********************************************************************** + * SHCreateItemFromRelativeName [SHELL32.@] + */ +EXTERN_C HRESULT WINAPI +SHCreateItemFromRelativeName( + _In_ IShellItem *parent, + _In_ PCWSTR pszName, + _In_opt_ IBindCtx *pbc, + _In_ REFIID riid, + _Out_ void **ppv) +{ + CComPtr desktop; + CComPtr folder; + CComHeapPtr pidlFolder; + CComHeapPtr pidlChild; + HRESULT hr; + + TRACE("(%p,%s,%p,%s,%p)\n", parent, debugstr_w(pszName), pbc, debugstr_guid(&riid), ppv); + + if (!ppv) + return E_POINTER; + *ppv = NULL; + + if (!pszName) + return E_INVALIDARG; + + hr = SHGetIDListFromObject(parent, &pidlFolder); + if (hr != S_OK) + return hr; + + hr = SHGetDesktopFolder(&desktop); + if (FAILED_UNEXPECTEDLY(hr)) + return hr; + + if (!_ILIsDesktop(pidlFolder)) { - return CDataObjectHIDA::CreateCIDA(pdo, &m_pCIDA, m_Medium); + hr = desktop->BindToObject(pidlFolder, NULL, IID_PPV_ARG(IShellFolder, &folder)); + if (FAILED_UNEXPECTEDLY(hr)) + return hr; } - inline UINT GetCount() const { return m_pCIDA->cidl; } - - // IShellItemArray - STDMETHODIMP BindToHandler(IBindCtx *pbc, REFGUID rbhid, REFIID riid, void **ppv) override { - UNIMPLEMENTED; - *ppv = NULL; - return E_NOTIMPL; + IShellFolder *psfBind = folder.p ? folder.p : desktop.p; + hr = psfBind->ParseDisplayName(NULL, pbc, const_cast(pszName), NULL, &pidlChild, NULL); } + if (FAILED_UNEXPECTEDLY(hr)) + return hr; - STDMETHODIMP GetPropertyStore(GETPROPERTYSTOREFLAGS flags, REFIID riid, void **ppv) override - { - UNIMPLEMENTED; - *ppv = NULL; - return E_NOTIMPL; - } + return SHCreateItemFromIDList(pidlChild, riid, ppv); +} - STDMETHODIMP GetPropertyDescriptionList(REFPROPERTYKEY keyType, REFIID riid, void **ppv) override - { - UNIMPLEMENTED; - *ppv = NULL; - return E_NOTIMPL; - } - - STDMETHODIMP GetAttributes(SIATTRIBFLAGS dwAttribFlags, SFGAOF sfgaoMask, SFGAOF *psfgaoAttribs) override - { - UNIMPLEMENTED; - *psfgaoAttribs = 0; - return E_NOTIMPL; - } - - STDMETHODIMP GetCount(DWORD*pCount) override - { - *pCount = m_pCIDA ? GetCount() : 0; - return S_OK; - } - - STDMETHODIMP GetItemAt(DWORD nIndex, IShellItem **ppItem) override - { - if (!ppItem) - return E_INVALIDARG; - *ppItem = NULL; - if (!m_pCIDA) - return E_UNEXPECTED; - if (nIndex >= GetCount()) - return E_FAIL; - return SHCreateShellItem(HIDA_GetPIDLFolder(m_pCIDA), NULL, - HIDA_GetPIDLItem(m_pCIDA, nIndex), ppItem); - } - - STDMETHODIMP EnumItems(IEnumShellItems **ppESI) override - { - UNIMPLEMENTED; - *ppESI = NULL; - return E_NOTIMPL; - } - -DECLARE_NO_REGISTRY() -DECLARE_NOT_AGGREGATABLE(CShellItemArray) - -BEGIN_COM_MAP(CShellItemArray) - COM_INTERFACE_ENTRY_IID(IID_IShellItemArray, IShellItemArray) -END_COM_MAP() -}; +/*********************************************************************** + * SHCreateItemInKnownFolder [SHELL32.@] + */ +EXTERN_C HRESULT WINAPI SHGetKnownFolderIDList( + REFKNOWNFOLDERID rfid, + DWORD flags, + HANDLE token, + PIDLIST_ABSOLUTE *pidl); EXTERN_C HRESULT WINAPI -SHCreateShellItemArrayFromDataObject(_In_ IDataObject *pdo, _In_ REFIID riid, _Out_ void **ppv) +SHCreateItemInKnownFolder( + _In_ REFKNOWNFOLDERID kfid, + _In_ DWORD dwFlags, + _In_opt_ PCWSTR pszFileName, + _In_ REFIID riid, + _Out_ void **ppv) { - return ShellObjectCreatorInit(pdo, riid, ppv); + TRACE("(%s,%lx,%s,%s,%p)\n", debugstr_guid(&kfid), dwFlags, debugstr_w(pszFileName), + debugstr_guid(&riid), ppv); + return E_NOTIMPL; + //TODO: Import SHGetKnownFolderIDList from wine +#if 0 + CComPtr parent; + CComHeapPtr pidl; + HRESULT hr; + + TRACE("(%s,%lx,%s,%s,%p)\n", debugstr_guid(&kfid), dwFlags, debugstr_w(pszFileName), + debugstr_guid(&riid), ppv); + + if (!ppv) + return E_POINTER; + *ppv = NULL; + + hr = SHGetKnownFolderIDList(kfid, dwFlags, NULL, &pidl); + if (hr != S_OK) + return hr; + + hr = SHCreateItemFromIDList(pidl, IID_PPV_ARG(IShellItem, &parent)); + if (FAILED_UNEXPECTEDLY(hr)) + return hr; + + if (pszFileName) + hr = SHCreateItemFromRelativeName(parent, pszFileName, NULL, riid, ppv); + else + hr = parent->QueryInterface(riid, ppv); + + return hr; +#endif } + +/*********************************************************************** + * SHGetItemFromObject [SHELL32.@] + */ +EXTERN_C HRESULT WINAPI +SHGetItemFromObject(_In_ IUnknown *punk, _In_ REFIID riid, _Out_ void **ppv) +{ + CComHeapPtr pidl; + HRESULT hr; + + TRACE("(%p,%s,%p)\n", punk, debugstr_guid(&riid), ppv); + + hr = SHGetIDListFromObject(punk, &pidl); + if (SUCCEEDED(hr)) + hr = SHCreateItemFromIDList(pidl, riid, ppv); + return hr; +} + +/*********************************************************************** + * SHGetPropertyStoreFromParsingName [SHELL32.@] + */ +EXTERN_C HRESULT WINAPI +SHGetPropertyStoreFromParsingName( + _In_ PCWSTR pszPath, + _In_opt_ IBindCtx *pbc, + _In_ GETPROPERTYSTOREFLAGS flags, + _In_ REFIID riid, + _Out_ void **ppv) +{ + CComPtr item; + HRESULT hr; + + TRACE("(%s,%p,%#x,%s,%p)\n", debugstr_w(pszPath), pbc, flags, debugstr_guid(&riid), ppv); + + if (!ppv) + return E_POINTER; + *ppv = NULL; + + hr = SHCreateItemFromParsingName(pszPath, pbc, IID_PPV_ARG(IShellItem2, &item)); + if (SUCCEEDED(hr)) + hr = item->GetPropertyStore(flags, riid, ppv); + + return hr; +} + +#endif /* DLL_EXPORT_VERSION >= _WIN32_WINNT_VISTA */ diff --git a/dll/win32/shell32/CShellItemArray.cpp b/dll/win32/shell32/CShellItemArray.cpp new file mode 100644 index 00000000000..08b2b0495dc --- /dev/null +++ b/dll/win32/shell32/CShellItemArray.cpp @@ -0,0 +1,353 @@ + + +#include "precomp.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +/*********************************************************************** + * CShellItemArray + */ + +CShellItemArray::CShellItemArray() : m_pHIDA(NULL) +{ +} + +CShellItemArray::~CShellItemArray() +{ + delete m_pHIDA; +} + +HRESULT +CShellItemArray::Initialize(_In_ IDataObject *pdo) +{ + m_pHIDA = new CDataObjectHIDA(pdo); + if (!m_pHIDA) + return E_OUTOFMEMORY; + + HRESULT hr = m_pHIDA->hr(); + if (FAILED(hr)) + { + delete m_pHIDA; + m_pHIDA = NULL; + } + return hr; +} + +UINT +CShellItemArray::ItemCount() const +{ + return m_pHIDA ? (*m_pHIDA)->cidl : 0; +} + +STDMETHODIMP +CShellItemArray::BindToHandler(_In_opt_ IBindCtx *pbc, _In_ REFGUID rbhid, _In_ REFIID riid, _Out_ void **ppv) +{ + UNIMPLEMENTED; + *ppv = NULL; + return E_NOTIMPL; +} + +STDMETHODIMP +CShellItemArray::GetPropertyStore(_In_ GETPROPERTYSTOREFLAGS flags, _In_ REFIID riid, _Out_ void **ppv) +{ + UNIMPLEMENTED; + *ppv = NULL; + return E_NOTIMPL; +} + +STDMETHODIMP +CShellItemArray::GetPropertyDescriptionList(_In_ REFPROPERTYKEY keyType, _In_ REFIID riid, _Out_ void **ppv) +{ + UNIMPLEMENTED; + *ppv = NULL; + return E_NOTIMPL; +} + +STDMETHODIMP +CShellItemArray::GetAttributes(_In_ SIATTRIBFLAGS dwAttribFlags, _In_ SFGAOF sfgaoMask, _Out_ SFGAOF *psfgaoAttribs) +{ + UNIMPLEMENTED; + *psfgaoAttribs = 0; + return E_NOTIMPL; +} + +STDMETHODIMP +CShellItemArray::GetCount(_Out_ DWORD *pCount) +{ + if (!pCount) + return E_INVALIDARG; + *pCount = ItemCount(); + return S_OK; +} + +STDMETHODIMP +CShellItemArray::GetItemAt(_In_ DWORD nIndex, _Out_ IShellItem **ppItem) +{ + if (!ppItem) + return E_INVALIDARG; + *ppItem = NULL; + if (!m_pHIDA) + return E_UNEXPECTED; + if (nIndex >= ItemCount()) + return E_FAIL; + return SHCreateShellItem(HIDA_GetPIDLFolder(*m_pHIDA), NULL, + HIDA_GetPIDLItem(*m_pHIDA, nIndex), ppItem); +} + +STDMETHODIMP +CShellItemArray::EnumItems(_Out_ IEnumShellItems **ppESI) +{ + UNIMPLEMENTED; + *ppESI = NULL; + return E_NOTIMPL; +} + +/*********************************************************************** + * CSimpleShellItemArray + */ + +HRESULT +CSimpleShellItemArray::Initialize(_In_reads_(count) IShellItem **pitems, _In_ UINT count) +{ + if (!m_items.SetCount(0)) + return E_OUTOFMEMORY; + for (UINT i = 0; i < count; ++i) + { + CComPtr ptr = pitems[i]; + if (!ptr) + return E_INVALIDARG; + m_items.Add(ptr); + } + return S_OK; +} + +STDMETHODIMP +CSimpleShellItemArray::BindToHandler(_In_opt_ IBindCtx *pbc, _In_ REFGUID rbhid, _In_ REFIID riid, _Out_ void **ppv) +{ + UNIMPLEMENTED; + *ppv = NULL; + return E_NOTIMPL; +} + +STDMETHODIMP +CSimpleShellItemArray::GetPropertyStore(_In_ GETPROPERTYSTOREFLAGS flags, _In_ REFIID riid, _Out_ void **ppv) +{ + UNIMPLEMENTED; + *ppv = NULL; + return E_NOTIMPL; +} + +STDMETHODIMP +CSimpleShellItemArray::GetPropertyDescriptionList(_In_ REFPROPERTYKEY keyType, _In_ REFIID riid, _Out_ void **ppv) +{ + UNIMPLEMENTED; + *ppv = NULL; + return E_NOTIMPL; +} + +STDMETHODIMP +CSimpleShellItemArray::GetAttributes(_In_ SIATTRIBFLAGS dwAttribFlags, _In_ SFGAOF sfgaoMask, _Out_ SFGAOF *psfgaoAttribs) +{ + HRESULT hr = S_OK; + SFGAOF attr; + + if (!psfgaoAttribs) + return E_POINTER; + + if (dwAttribFlags & ~(SIATTRIBFLAGS_AND | SIATTRIBFLAGS_OR)) + FIXME("%08x contains unsupported attribution flags\n", dwAttribFlags); + + for (size_t i = 0; i < m_items.GetCount(); ++i) + { + hr = m_items[i]->GetAttributes(sfgaoMask, &attr); + if (FAILED_UNEXPECTEDLY(hr)) + break; + + if (i == 0) + { + *psfgaoAttribs = attr; + continue; + } + + if ((dwAttribFlags & SIATTRIBFLAGS_MASK) == SIATTRIBFLAGS_AND) + *psfgaoAttribs &= attr; + else + *psfgaoAttribs |= attr; + } + + if (SUCCEEDED(hr)) + { + if (*psfgaoAttribs == sfgaoMask) + return S_OK; + return S_FALSE; + } + return hr; +} + +STDMETHODIMP +CSimpleShellItemArray::GetCount(_Out_ DWORD *pdwNumItems) +{ + if (!pdwNumItems) + return E_INVALIDARG; + *pdwNumItems = static_cast(m_items.GetCount()); + return S_OK; +} + +STDMETHODIMP +CSimpleShellItemArray::GetItemAt(_In_ DWORD dwIndex, _Out_ IShellItem **ppsi) +{ + if (!ppsi) + return E_INVALIDARG; + *ppsi = NULL; + if (dwIndex >= m_items.GetCount()) + return E_FAIL; + *ppsi = m_items[dwIndex]; + (*ppsi)->AddRef(); + return S_OK; +} + +STDMETHODIMP +CSimpleShellItemArray::EnumItems(_Out_ IEnumShellItems **ppenumShellItems) +{ + UNIMPLEMENTED; + *ppenumShellItems = NULL; + return E_NOTIMPL; +} + +HRESULT +CreateShellItemArrayFromItems(_In_reads_(cidl) IShellItem **items, _In_ UINT cidl, _In_ REFIID riid, _Out_ void **ppv) +{ + return ShellObjectCreatorInit(items, cidl, riid, ppv); +} + +/*********************************************************************** + * SHCreateShellItemArray [SHELL32.@] + */ +EXTERN_C HRESULT WINAPI +SHCreateShellItemArray( + _In_opt_ PCIDLIST_ABSOLUTE pidlParent, + _In_opt_ IShellFolder *psf, + _In_ UINT cidl, + _In_reads_opt_(cidl) PCUITEMID_CHILD_ARRAY ppidl, + _Out_ IShellItemArray **ppsiItemArray) +{ + CComHeapPtr array; + HRESULT hr = E_FAIL; + + TRACE("(%p,%p,%u,%p,%p)\n", pidlParent, psf, cidl, ppidl, ppsiItemArray); + + if (!ppsiItemArray) + return E_POINTER; + *ppsiItemArray = NULL; + + if (!pidlParent && !psf) + return E_POINTER; + + if (!ppidl) + return E_INVALIDARG; + + array.Allocate(cidl); + if (!array) + return E_OUTOFMEMORY; + + for (UINT i = 0; i < cidl; ++i) + array[i] = NULL; + + for (UINT i = 0; i < cidl; ++i) + { + hr = SHCreateShellItem(pidlParent, psf, ppidl[i], &array[i]); + if (FAILED_UNEXPECTEDLY(hr)) + break; + } + + if (SUCCEEDED(hr)) + { + hr = CreateShellItemArrayFromItems(array, cidl, IID_PPV_ARG(IShellItemArray, ppsiItemArray)); + } + + for (UINT i = 0; i < cidl; ++i) + { + if (array[i]) + array[i]->Release(); + } + + return hr; +} + +/*********************************************************************** + * SHCreateShellItemArrayFromIDLists [SHELL32.@] + */ +EXTERN_C HRESULT WINAPI +SHCreateShellItemArrayFromIDLists( + _In_ UINT cidl, + _In_reads_(cidl) PCIDLIST_ABSOLUTE_ARRAY pidlArray, + _Out_ IShellItemArray **ppsiItemArray) +{ + CComHeapPtr array; + HRESULT hr; + + TRACE("(%u,%p,%p)\n", cidl, pidlArray, ppsiItemArray); + + if (!ppsiItemArray) + return E_POINTER; + *ppsiItemArray = NULL; + + if (cidl == 0 || !pidlArray) + return E_INVALIDARG; + + array.Allocate(cidl); + if (!array) + return E_OUTOFMEMORY; + + for (UINT i = 0; i < cidl; ++i) + array[i] = NULL; + + for (UINT i = 0; i < cidl; ++i) + { + hr = SHCreateShellItem(NULL, NULL, pidlArray[i], &array[i]); + if (FAILED_UNEXPECTEDLY(hr)) + break; + } + + if (SUCCEEDED(hr)) + { + hr = CreateShellItemArrayFromItems(array, cidl, IID_PPV_ARG(IShellItemArray, ppsiItemArray)); + } + + for (UINT i = 0; i < cidl; ++i) + { + if (array[i]) + array[i]->Release(); + } + + return hr; +} + +/*********************************************************************** + * SHCreateShellItemArrayFromShellItem [SHELL32.@] + */ +EXTERN_C HRESULT WINAPI +SHCreateShellItemArrayFromShellItem(_In_ IShellItem *psi, _In_ REFIID riid, _Out_ void **ppv) +{ + IShellItem *items[1] = { psi }; + + TRACE("(%p,%s,%p)\n", psi, debugstr_guid(&riid), ppv); + + if (!ppv) + return E_POINTER; + *ppv = NULL; + + if (!psi) + return E_INVALIDARG; + + return CreateShellItemArrayFromItems(items, 1, riid, ppv); +} + +/*********************************************************************** + * SHCreateShellItemArrayFromDataObject [SHELL32.@] + */ +EXTERN_C HRESULT WINAPI +SHCreateShellItemArrayFromDataObject(_In_ IDataObject *pdo, _In_ REFIID riid, _Out_ void **ppv) +{ + return ShellObjectCreatorInit(pdo, riid, ppv); +} diff --git a/dll/win32/shell32/CShellItemArray.h b/dll/win32/shell32/CShellItemArray.h new file mode 100644 index 00000000000..3e7304eb001 --- /dev/null +++ b/dll/win32/shell32/CShellItemArray.h @@ -0,0 +1,35 @@ + + +#pragma once + +class CShellItemArray : + public CComCoClass, + public CComObjectRootEx, + public IShellItemArray +{ + CDataObjectHIDA *m_pHIDA; + +public: + CShellItemArray(); + virtual ~CShellItemArray(); + + HRESULT Initialize(_In_ IDataObject *pdo); + + UINT ItemCount() const; + + // IShellItemArray + STDMETHODIMP BindToHandler(_In_opt_ IBindCtx *pbc, _In_ REFGUID rbhid, _In_ REFIID riid, _Out_ void **ppv) override; + STDMETHODIMP GetPropertyStore(_In_ GETPROPERTYSTOREFLAGS flags, _In_ REFIID riid, _Out_ void **ppv) override; + STDMETHODIMP GetPropertyDescriptionList(_In_ REFPROPERTYKEY keyType, _In_ REFIID riid, _Out_ void **ppv) override; + STDMETHODIMP GetAttributes(_In_ SIATTRIBFLAGS dwAttribFlags, _In_ SFGAOF sfgaoMask, _Out_ SFGAOF *psfgaoAttribs) override; + STDMETHODIMP GetCount(_Out_ DWORD *pCount) override; + STDMETHODIMP GetItemAt(_In_ DWORD nIndex, _Out_ IShellItem **ppItem) override; + STDMETHODIMP EnumItems(_Out_ IEnumShellItems **ppESI) override; + +DECLARE_NO_REGISTRY() +DECLARE_NOT_AGGREGATABLE(CShellItemArray) + +BEGIN_COM_MAP(CShellItemArray) + COM_INTERFACE_ENTRY_IID(IID_IShellItemArray, IShellItemArray) +END_COM_MAP() +}; diff --git a/dll/win32/shell32/CShellLibrary.cpp b/dll/win32/shell32/CShellLibrary.cpp new file mode 100644 index 00000000000..a7b96442db0 --- /dev/null +++ b/dll/win32/shell32/CShellLibrary.cpp @@ -0,0 +1,126 @@ +/* + * PROJECT: shell32 + * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later) + * PURPOSE: IShellLibrary implementation + * COPYRIGHT: Copyright 2021 Oleg Dubinskiy (oleg.dubinskij2013@yandex.ua) + */ + +#include "precomp.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +/*********************************************************************** +* IShellLibrary implementation +*/ + +CShellLibrary::CShellLibrary() +{ +} + +CShellLibrary::~CShellLibrary() +{ +} + +STDMETHODIMP CShellLibrary::AddFolder(IShellItem *psiLocation) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +STDMETHODIMP CShellLibrary::Commit() +{ + UNIMPLEMENTED; + /* Fake success */ + return S_OK; +} + +STDMETHODIMP CShellLibrary::GetDefaultSaveFolder(DEFAULTSAVEFOLDERTYPE dsft, REFIID riid, void **ppv) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +STDMETHODIMP CShellLibrary::GetFolders(LIBRARYFOLDERFILTER lff, REFIID riid, void **ppv) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +STDMETHODIMP CShellLibrary::GetFolderType(FOLDERTYPEID *pftid) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +STDMETHODIMP CShellLibrary::GetIcon(LPWSTR *ppszIcon) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +STDMETHODIMP CShellLibrary::GetOptions(LIBRARYOPTIONFLAGS *plofOptions) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +STDMETHODIMP CShellLibrary::LoadLibraryFromItem(IShellItem *psiLibrary, DWORD grfMode) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +STDMETHODIMP CShellLibrary::LoadLibraryFromKnownFolder(REFKNOWNFOLDERID kfidLibrary, DWORD grfMode) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +STDMETHODIMP CShellLibrary::RemoveFolder(IShellItem *psiLocation) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +STDMETHODIMP CShellLibrary::ResolveFolder(IShellItem *psiFolderToResolve, DWORD dwTimeout, REFIID riid, void **ppv) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +STDMETHODIMP CShellLibrary::Save(IShellItem *psiFolderToSaveIn, LPCWSTR pszLibraryName, LIBRARYSAVEFLAGS lsf, IShellItem **ppsiSavedTo) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +STDMETHODIMP CShellLibrary::SaveInKnownFolder(REFKNOWNFOLDERID kfidToSaveIn, LPCWSTR pszLibraryName, LIBRARYSAVEFLAGS lsf, IShellItem **ppsiSavedTo) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +STDMETHODIMP CShellLibrary::SetDefaultSaveFolder(DEFAULTSAVEFOLDERTYPE dsft, IShellItem *psi) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +STDMETHODIMP CShellLibrary::SetFolderType(REFFOLDERTYPEID ftid) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +STDMETHODIMP CShellLibrary::SetIcon(LPCWSTR pszIcon) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +STDMETHODIMP CShellLibrary::SetOptions(LIBRARYOPTIONFLAGS lofMask, LIBRARYOPTIONFLAGS lofOptions) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + diff --git a/dll/win32/shell32/CShellLibrary.h b/dll/win32/shell32/CShellLibrary.h new file mode 100644 index 00000000000..30a3b34383b --- /dev/null +++ b/dll/win32/shell32/CShellLibrary.h @@ -0,0 +1,50 @@ +/* + * PROJECT: shell32 + * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later) + * PURPOSE: IShellLibrary header + * COPYRIGHT: Copyright 2021 Oleg Dubinskiy (oleg.dubinskij2013@yandex.ua) + */ + +#ifndef _CSHELLLIBRARY_H_ +#define _CSHELLLIBRARY_H_ + +class CShellLibrary : + public CComCoClass, + public CComObjectRootEx, + public IShellLibrary +{ +public: + CShellLibrary(); + ~CShellLibrary(); + + /*** IShellLibrary methods ***/ + STDMETHODIMP AddFolder(IShellItem *psiLocation) override; + STDMETHODIMP Commit() override; + STDMETHODIMP GetDefaultSaveFolder(DEFAULTSAVEFOLDERTYPE dsft, REFIID riid, void **ppv) override; + STDMETHODIMP GetFolders(LIBRARYFOLDERFILTER lff, REFIID riid, void **ppv) override; + STDMETHODIMP GetFolderType(FOLDERTYPEID *pftid) override; + STDMETHODIMP GetIcon(LPWSTR *ppszIcon) override; + STDMETHODIMP GetOptions(LIBRARYOPTIONFLAGS *plofOptions) override; + STDMETHODIMP LoadLibraryFromItem(IShellItem *psiLibrary, DWORD grfMode) override; + STDMETHODIMP LoadLibraryFromKnownFolder(REFKNOWNFOLDERID kfidLibrary, DWORD grfMode) override; + STDMETHODIMP RemoveFolder(IShellItem *psiLocation) override; + STDMETHODIMP ResolveFolder(IShellItem *psiFolderToResolve, DWORD dwTimeout, REFIID riid, void **ppv) override; + STDMETHODIMP Save(IShellItem *psiFolderToSaveIn, LPCWSTR pszLibraryName, LIBRARYSAVEFLAGS lsf, IShellItem **ppsiSavedTo) override; + STDMETHODIMP SaveInKnownFolder(REFKNOWNFOLDERID kfidToSaveIn, LPCWSTR pszLibraryName, LIBRARYSAVEFLAGS lsf, IShellItem **ppsiSavedTo) override; + STDMETHODIMP SetDefaultSaveFolder(DEFAULTSAVEFOLDERTYPE dsft, IShellItem *psi) override; + STDMETHODIMP SetFolderType(REFFOLDERTYPEID ftid) override; + STDMETHODIMP SetIcon(LPCWSTR pszIcon) override; + STDMETHODIMP SetOptions(LIBRARYOPTIONFLAGS lofMask, LIBRARYOPTIONFLAGS lofOptions) override; + + +DECLARE_REGISTRY_RESOURCEID(IDR_SHELLLIBRARY) +DECLARE_NOT_AGGREGATABLE(CShellLibrary) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(CShellLibrary) + COM_INTERFACE_ENTRY_IID(IID_IShellLibrary, IShellLibrary) +END_COM_MAP() +}; + +#endif // _CSHELLLIBRARY_H_ diff --git a/dll/win32/shell32/CSimpleShellItemArray.h b/dll/win32/shell32/CSimpleShellItemArray.h new file mode 100644 index 00000000000..d084eb88941 --- /dev/null +++ b/dll/win32/shell32/CSimpleShellItemArray.h @@ -0,0 +1,35 @@ + +#pragma once + +class CSimpleShellItemArray : + public CComCoClass, + public CComObjectRootEx, + public IShellItemArray +{ + CAtlArray> m_items; + +public: + HRESULT Initialize(_In_reads_(count) IShellItem **pitems, _In_ UINT count); + + // IShellItemArray + STDMETHODIMP BindToHandler(_In_opt_ IBindCtx *pbc, _In_ REFGUID rbhid, _In_ REFIID riid, _Out_ void **ppv) override; + STDMETHODIMP GetPropertyStore(_In_ GETPROPERTYSTOREFLAGS flags, _In_ REFIID riid, _Out_ void **ppv) override; + STDMETHODIMP GetPropertyDescriptionList(_In_ REFPROPERTYKEY keyType, _In_ REFIID riid, _Out_ void **ppv) override; + STDMETHODIMP GetAttributes(_In_ SIATTRIBFLAGS dwAttribFlags, _In_ SFGAOF sfgaoMask, _Out_ SFGAOF *psfgaoAttribs) override; + STDMETHODIMP GetCount(_Out_ DWORD *pdwNumItems) override; + STDMETHODIMP GetItemAt(_In_ DWORD dwIndex, _Out_ IShellItem **ppsi) override; + STDMETHODIMP EnumItems(_Out_ IEnumShellItems **ppenumShellItems) override; + +DECLARE_NO_REGISTRY() +DECLARE_NOT_AGGREGATABLE(CSimpleShellItemArray) + +BEGIN_COM_MAP(CSimpleShellItemArray) + COM_INTERFACE_ENTRY_IID(IID_IShellItemArray, IShellItemArray) +END_COM_MAP() +}; + +HRESULT CreateShellItemArrayFromItems( + _In_reads_(cidl) IShellItem **items, + _In_ UINT cidl, + _In_ REFIID riid, + _Out_ void **ppv); diff --git a/dll/win32/shell32/CUserEventTimer.cpp b/dll/win32/shell32/CUserEventTimer.cpp new file mode 100644 index 00000000000..9ba1dfbe297 --- /dev/null +++ b/dll/win32/shell32/CUserEventTimer.cpp @@ -0,0 +1,56 @@ +/* + * PROJECT: shell32 + * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later) + * PURPOSE: IUserEventTimer implementation + * COPYRIGHT: Copyright 2021 Oleg Dubinskiy (oleg.dubinskij2013@yandex.ua) + */ + +#include "precomp.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +/*********************************************************************** +* IUserEventTimerCallback implementation +*/ + +STDMETHODIMP +CUserEventTimer::UserEventTimerProc(ULONG uUserEventTimerID, UINT uTimerElapse) +{ + UNIMPLEMENTED; + return S_OK; +} + +/*********************************************************************** +* IUserEventTimer implementation +*/ + +STDMETHODIMP +CUserEventTimer::SetUserEventTimer(HWND hWnd, UINT uCallbackMsg, UINT uTimerElapse, + IUserEventTimerCallback *pUserEventTimerCallback, + ULONG *puUserEventTimerID) +{ + UNIMPLEMENTED; + return S_OK; +} + +STDMETHODIMP +CUserEventTimer::KillUserEventTimer(HWND hWnd, ULONG uUserEventTimerID) +{ + UNIMPLEMENTED; + return S_OK; +} + +STDMETHODIMP +CUserEventTimer::GetUserEventTimerElapsed(HWND hWnd, ULONG uUserEventTimerID, UINT *puTimerElapsed) +{ + UNIMPLEMENTED; + return S_OK; +} + +STDMETHODIMP +CUserEventTimer::InitTimerTickInterval(UINT uTimerTickIntervalMs) +{ + UNIMPLEMENTED; + return S_OK; +} + diff --git a/dll/win32/shell32/CUserEventTimer.h b/dll/win32/shell32/CUserEventTimer.h new file mode 100644 index 00000000000..30eadaf5506 --- /dev/null +++ b/dll/win32/shell32/CUserEventTimer.h @@ -0,0 +1,40 @@ +/* + * PROJECT: shell32 + * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later) + * PURPOSE: IUserEventTimer header + * COPYRIGHT: Copyright 2021 Oleg Dubinskiy (oleg.dubinskij2013@yandex.ua) + */ + +#ifndef _CUSEREVENTTIMER_H_ +#define _CUSEREVENTTIMER_H_ + +class CUserEventTimer : + public CComCoClass, + public CComObjectRootEx, + public IUserEventTimer +{ +public: + + /*** IUserEventTimerCallback methods ***/ + virtual STDMETHODIMP UserEventTimerProc(ULONG uUserEventTimerID, UINT uTimerElapse) override; + + /*** IUserEventTimer methods ***/ + virtual STDMETHODIMP SetUserEventTimer(HWND hWnd, UINT uCallbackMsg, UINT uTimerElapse, + IUserEventTimerCallback *pUserEventTimerCallback, + ULONG *puUserEventTimerID) override; + virtual STDMETHODIMP KillUserEventTimer(HWND hWnd, ULONG uUserEventTimerID) override; + virtual STDMETHODIMP GetUserEventTimerElapsed(HWND hWnd, ULONG uUserEventTimerID, UINT *puTimerElapsed) override; + virtual STDMETHODIMP InitTimerTickInterval(UINT uTimerTickIntervalMs) override; + + +DECLARE_REGISTRY_RESOURCEID(IDR_USEREVENTTIMER) +DECLARE_NOT_AGGREGATABLE(CUserEventTimer) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(CUserEventTimer) + COM_INTERFACE_ENTRY_IID(IID_IUserEventTimer, IUserEventTimer) +END_COM_MAP() +}; + +#endif // _CUSEREVENTTIMER_H_ diff --git a/dll/win32/shell32/precomp.h b/dll/win32/shell32/precomp.h index 159c71603b0..91b77f18445 100644 --- a/dll/win32/shell32/precomp.h +++ b/dll/win32/shell32/precomp.h @@ -77,11 +77,14 @@ #include "CEnumIDListBase.h" #include "shfldr.h" #include "CShellItem.h" +#include "CShellItemArray.h" +#include "CSimpleShellItemArray.h" #include "CShellLink.h" #include "CFolderItemVerbs.h" #include "CFolderItems.h" #include "CFolder.h" #include "CShellDispatch.h" +#include "CShellLibrary.h" #include "CDropTargetHelper.h" #include "CFolderOptions.h" #include "folders/CFSFolder.h" @@ -110,6 +113,7 @@ #include "shellmenu/CMenuSite.h" #include "shellmenu/CMergedFolder.h" #include "shellmenu/shellmenu.h" +#include "CUserEventTimer.h" #include "CUserNotification.h" #include "dialogs/folder_options.h" #include "shelldesktop/CChangeNotifyServer.h" diff --git a/dll/win32/shell32/res/rgs/shelllibrary.rgs b/dll/win32/shell32/res/rgs/shelllibrary.rgs new file mode 100644 index 00000000000..44068514ee5 --- /dev/null +++ b/dll/win32/shell32/res/rgs/shelllibrary.rgs @@ -0,0 +1,13 @@ +HKCR +{ + NoRemove CLSID + { + ForceRemove {D9B3211D-E57F-4426-AAEF-30A806ADD397} = s 'Shell Library API' + { + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + } + } +} diff --git a/dll/win32/shell32/res/rgs/usereventtimer.rgs b/dll/win32/shell32/res/rgs/usereventtimer.rgs new file mode 100644 index 00000000000..9e5d3d10d94 --- /dev/null +++ b/dll/win32/shell32/res/rgs/usereventtimer.rgs @@ -0,0 +1,13 @@ +HKCR +{ + NoRemove CLSID + { + ForceRemove {864A1288-354C-4D19-9D68-C2742BB14997} = s 'User Event Timer' + { + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + } + } +} diff --git a/dll/win32/shell32/rgs_res.rc b/dll/win32/shell32/rgs_res.rc index 6be33e7284a..b88cd19f813 100644 --- a/dll/win32/shell32/rgs_res.rc +++ b/dll/win32/shell32/rgs_res.rc @@ -27,7 +27,9 @@ IDR_EXEDROPHANDLER REGISTRY "res/rgs/exedrophandler.rgs" IDR_MERGEDFOLDER REGISTRY "res/rgs/mergedfolder.rgs" IDR_REBARBANDSITE REGISTRY "res/rgs/rebarbandsite.rgs" IDR_USERNOTIFICATION REGISTRY "res/rgs/usernotification.rgs" +IDR_USEREVENTTIMER REGISTRY "res/rgs/usereventtimer.rgs" IDR_SHELL REGISTRY "res/rgs/shell.rgs" +IDR_SHELLLIBRARY REGISTRY "res/rgs/shelllibrary.rgs" IDR_ACTIVEDESKTOP REGISTRY "res/rgs/activedesktop.rgs" IDR_SENDTOMENU REGISTRY "res/rgs/sendtomenu.rgs" IDR_COPYASPATHMENU REGISTRY "res/rgs/copyaspathmenu.rgs" diff --git a/dll/win32/shell32/shell32.cpp b/dll/win32/shell32/shell32.cpp index ab3209d8481..c42605a22da 100644 --- a/dll/win32/shell32/shell32.cpp +++ b/dll/win32/shell32/shell32.cpp @@ -326,6 +326,7 @@ BEGIN_OBJECT_MAP(ObjectMap) OBJECT_ENTRY(CLSID_ShellItem, CShellItem) OBJECT_ENTRY(CLSID_ShellLink, CShellLink) OBJECT_ENTRY(CLSID_Shell, CShellDispatch) + OBJECT_ENTRY(CLSID_ShellLibrary, CShellLibrary) OBJECT_ENTRY(CLSID_DragDropHelper, CDropTargetHelper) OBJECT_ENTRY(CLSID_ControlPanel, CControlPanelFolder) OBJECT_ENTRY(CLSID_OpenControlPanel, COpenControlPanel) @@ -350,6 +351,7 @@ BEGIN_OBJECT_MAP(ObjectMap) OBJECT_ENTRY(CLSID_ExeDropHandler, CExeDropHandler) OBJECT_ENTRY(CLSID_QueryAssociations, CQueryAssociations) OBJECT_ENTRY(CLSID_UserNotification, CUserNotification) + OBJECT_ENTRY(CLSID_UserEventTimer, CUserEventTimer) END_OBJECT_MAP() CShell32Module gModule; diff --git a/dll/win32/shell32/shell32.spec b/dll/win32/shell32/shell32.spec index c7ec83efbd1..28189a60d10 100644 --- a/dll/win32/shell32/shell32.spec +++ b/dll/win32/shell32/shell32.spec @@ -271,6 +271,7 @@ 660 stdcall -noname FileIconInit(long) 680 stdcall IsUserAnAdmin() 681 stdcall -noname SHGetAppCompatFlags(long) shlwapi.SHGetAppCompatFlags +682 stdcall -stub -version=0x601+ StgMakeUniqueName(ptr wstr long ptr ptr) 683 stub -noname SHStgOpenStorageW 684 stub -noname SHStgOpenStorageA 685 stdcall SHPropStgCreate(ptr ptr ptr long long long ptr ptr) @@ -397,8 +398,22 @@ 871 stub -version=0x600+ -noname DUI_Shell32_EndDeferUninitialization 872 stub -version=0x600+ -noname SHCreateKindFilter 873 stub -version=0x600+ -noname SHIconIndexFromPIDL -874 stub -version=0x600+ -noname SHLaunchSearch +874 stub -version=0x600+ -noname SHLaunchSearch # Vista:874, Win7:886 +881 stub -noname -version=0x601+ SHEnumClassesOfCategories +882 stub -noname -version=0x601+ SHWriteClassesOfCategories +884 stub -noname -version=0x601+ SHDoDragDropWithPreferredEffect +885 stdcall -noname -version=0x601+ RunInstallUninstallStubs() 887 stub -noname -version=0x601+ SHExtCoCreateInstanceCheckCategory +888 stub -noname -version=0x601+ SHLimitInputEndSubclass +892 stub -noname -version=0x601+ GetSqmableFileName +893 stub -noname -version=0x601+ SetWindowRelaunchProperties +894 stub -noname -version=0x601+ MakeDestinationItem +895 stdcall -noname -version=0x601+ GetAppPathFromLink(ptr wstr long) +896 stub -noname -version=0x601+ ClearDestinationsForAllApps +897 stub -noname -version=0x601+ SaveTopViewSettings +899 stdcall -stub -noname -version=0x601+ SetExplorerServerMode(long) +900 stub -noname -version=0x601+ GetAppIDRoot +902 stub -noname -version=0x601+ IsSearchEnabled # Automatically assigned ordinals: @ stdcall OpenAs_RunDLLA(long long str long) # 2k3:101, Vista:125 @@ -488,19 +503,19 @@ @ stub -version=0x600+ SHCreateDefaultPropertiesOp # Vista:327 @ stdcall SHCreateDirectoryExA(long str ptr) # 2k3:278, Vista:328 @ stdcall SHCreateDirectoryExW(long wstr ptr) # 2k3:279, Vista:329 -@ stub -version=0x600+ SHCreateItemFromIDList # Vista:330 -@ stub -version=0x600+ SHCreateItemFromParsingName # Vista:331 -@ stub -version=0x600+ SHCreateItemFromRelativeName # Vista:332 -@ stub -version=0x600+ SHCreateItemInKnownFolder # Vista:333 -@ stub -version=0x600+ SHCreateItemWithParent # Vista:334 +@ stdcall -version=0x600+ SHCreateItemFromIDList(ptr ptr ptr) # Vista:330 +@ stdcall -version=0x600+ SHCreateItemFromParsingName(wstr ptr ptr ptr) # Vista:331 +@ stdcall -version=0x600+ SHCreateItemFromRelativeName(ptr wstr ptr ptr ptr) # Vista:332 +@ stdcall -version=0x600+ SHCreateItemInKnownFolder(ptr long wstr ptr ptr) # Vista:333 +@ stdcall -stub -version=0x600+ SHCreateItemWithParent(ptr ptr ptr ptr ptr) # Vista:334 @ stub SHCreateLocalServerRunDll # 2k3:280, Vista:335 @ stdcall SHCreateProcessAsUserW(ptr) # 2k3:281, Vista:336 @ stdcall SHCreateQueryCancelAutoPlayMoniker(ptr) # 2k3:282, Vista:337 @ stdcall SHCreateShellItem(ptr ptr ptr ptr) # 2k3:283, Vista:338 -@ stub -version=0x600+ SHCreateShellItemArray # Vista:339 +@ stdcall -version=0x600+ SHCreateShellItemArray(ptr ptr long ptr ptr) # Vista:339 @ stdcall -version=0x600+ SHCreateShellItemArrayFromDataObject(ptr ptr ptr) # Vista:340 -@ stub -version=0x600+ SHCreateShellItemArrayFromIDLists # Vista:341 -@ stub -version=0x600+ SHCreateShellItemArrayFromShellItem # Vista:342 +@ stdcall -version=0x600+ SHCreateShellItemArrayFromIDLists(long ptr ptr) # Vista:341 +@ stdcall -version=0x600+ SHCreateShellItemArrayFromShellItem(ptr ptr ptr) # Vista:342 @ stdcall SHEmptyRecycleBinA(long str long) # 2k3:284, Vista:343 @ stdcall SHEmptyRecycleBinW(long wstr long) # 2k3:285, Vista:344 @ stub SHEnableServiceObject # 2k3:286, Vista:345 @@ -543,7 +558,7 @@ @ stub -version=0x600+ SHGetPathFromIDListEx # Vista:382 @ stdcall SHGetPathFromIDListW(ptr ptr) # 2k3:315, Vista:383 @ stub -version=0x600+ SHGetPropertyStoreFromIDList # Vista:384 -@ stub -version=0x600+ SHGetPropertyStoreFromParsingName # Vista:385 +@ stdcall -version=0x600+ SHGetPropertyStoreFromParsingName(wstr ptr ptr ptr ptr) # Vista:385 @ stdcall SHGetSettings(ptr long) # 2k3:316, Vista:386 @ stdcall SHGetSpecialFolderLocation(long long ptr) # 2k3:317, Vista:387 @ stdcall SHGetSpecialFolderPathA(long ptr long long) # 2k3:318, Vista:388 @@ -566,7 +581,7 @@ @ stdcall SHPathPrepareForWriteW(long ptr wstr long) # 2k3:332, Vista:402 @ stdcall SHQueryRecycleBinA(str ptr) # 2k3:333, Vista:403 @ stdcall SHQueryRecycleBinW(wstr ptr) # 2k3:334, Vista:404 -@ stub -version=0x600+ SHQueryUserNotificationState # Vista:405 +@ stdcall -version=0x600+ SHQueryUserNotificationState(ptr) # Vista:405 @ stub -version=0x600+ SHRemoveLocalizedName # Vista:406 @ stub -version=0x600+ SHSetDefaultProperties # Vista:407 @ stub -version=0x600+ SHSetKnownFolderPath # Vista:408 @@ -637,3 +652,13 @@ @ stdcall StrStrW(wstr wstr) shlwapi.StrStrW # 2k3:396, Vista:456 @ stdcall WOWShellExecute(ptr str str str str long ptr) # 2k3:397, Vista:457 @ stub -version=0x600+ WaitForExplorerRestartW # Vista:458 + +; Win7+ - These ordinals are higher than any of the ones in win vista +@ stdcall -stub -version=0x601+ SHAssocEnumHandlersForProtocolByApplication(wstr ptr ptr) +@ stdcall -stub -version=0x601+ Shell_NotifyIconGetRect(ptr ptr) +@ stdcall -stub -version=0x601+ SHGetKnownFolderItem(ptr ptr ptr ptr ptr) +@ stdcall -version=0x601+ SHGetItemFromObject(ptr long ptr) +@ stdcall -version=0x600+ SHGetItemFromDataObject(ptr long ptr ptr) + +@ stdcall -version=0x601+ GetCurrentProcessExplicitAppUserModelID(wstr) +@ stdcall -version=0x601+ SetCurrentProcessExplicitAppUserModelID(wstr) diff --git a/dll/win32/shell32/shresdef.h b/dll/win32/shell32/shresdef.h index d145f154c59..fc3027d2eac 100644 --- a/dll/win32/shell32/shresdef.h +++ b/dll/win32/shell32/shresdef.h @@ -961,3 +961,5 @@ #define IDR_RECYCLEBINCLEANER 162 #define IDR_EXPLORER 163 #define IDR_SYSTEMFILEASSOC 164 +#define IDR_SHELLLIBRARY 165 +#define IDR_USEREVENTTIMER 166 diff --git a/dll/win32/shell32/stubs.cpp b/dll/win32/shell32/stubs.cpp index 5ecd7ab6c08..0a9d8cbcd01 100644 --- a/dll/win32/shell32/stubs.cpp +++ b/dll/win32/shell32/stubs.cpp @@ -774,3 +774,62 @@ DWORD WINAPI CheckStagingArea(VOID) /* Called by native explorer */ return 0; } + +/* + * Unimplemented + */ + +EXTERN_C HRESULT +WINAPI +GetAppPathFromLink(IShellItem* pItem, + LPWSTR pwszPathBuffer, + DWORD dwBufferLen) +{ + FIXME("GetAppPathFromLink() stub\n"); + return S_OK; +} + +/* + * Unimplemented + */ +EXTERN_C HRESULT +WINAPI +GetCurrentProcessExplicitAppUserModelID(PWSTR *AppID) +{ + return SHStrDupW(L"ROS FixMe", AppID); +} + +/* + * Unimplemented + */ +HRESULT WINAPI +SetCurrentProcessExplicitAppUserModelID(PCWSTR AppID) +{ + FIXME("SetCurrentProcessExplicitAppUserModelID stub\n"); + return S_OK; +} + +/* + * Unimplemented + */ +EXTERN_C DWORD +WINAPI +RunInstallUninstallStubs(VOID) +{ + FIXME("RunInstallUninstallStubs() stub!\n"); + return 0; +} + +/* + * Unimplemented + */ +EXTERN_C HRESULT +WINAPI +SHQueryUserNotificationState(QUERY_USER_NOTIFICATION_STATE *pquns) +{ + FIXME("SHQueryUserNotificationState() stub\n"); + if (!pquns) + return E_INVALIDARG; + *pquns = QUNS_ACCEPTS_NOTIFICATIONS; + return S_OK; +} diff --git a/dll/win32/shell32/wine/pidl.c b/dll/win32/shell32/wine/pidl.c index eb3dbef2dbc..6ab17d2299b 100644 --- a/dll/win32/shell32/wine/pidl.c +++ b/dll/win32/shell32/wine/pidl.c @@ -1665,6 +1665,7 @@ HRESULT WINAPI SHGetNameFromIDList(PCIDLIST_ABSOLUTE pidl, SIGDN sigdnName, PWST return ret; } +#ifndef __REACTOS__ /************************************************************************* * SHGetItemFromDataObject [SHELL32.@] */ @@ -1673,6 +1674,7 @@ HRESULT WINAPI SHGetItemFromDataObject(IDataObject *pdtobj, DATAOBJ_GET_ITEM_FLA { return E_NOTIMPL; // FIXME } +#endif /************************************************************************* * SHGetIDListFromObject [SHELL32.@] diff --git a/dll/win32/shell32/wine/shell32_main.h b/dll/win32/shell32/wine/shell32_main.h index c5b11b17e53..724a78b8336 100644 --- a/dll/win32/shell32/wine/shell32_main.h +++ b/dll/win32/shell32/wine/shell32_main.h @@ -140,6 +140,9 @@ HRESULT WINAPI IFileSystemBindData_Constructor(const WIN32_FIND_DATAW *pfd, LPBC HRESULT WINAPI CPanel_ExtractIconA(LPITEMIDLIST pidl, LPCSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize) DECLSPEC_HIDDEN; HRESULT WINAPI CPanel_ExtractIconW(LPITEMIDLIST pidl, LPCWSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize) DECLSPEC_HIDDEN; +HRESULT CRegFolder_CreateInstance(const GUID *pGuid, LPCITEMIDLIST pidlRoot, LPCWSTR lpszPath, LPCWSTR lpszEnumKeyName, REFIID riid, void **ppv); +HRESULT WINAPI CustomDestinationList_Constructor(IUnknown *outer, REFIID riid, void **obj); + /* initialisation for FORMATETC */ #define InitFormatEtc(fe, cf, med) \ {\ diff --git a/dll/win32/shell32/wine/shellpath.c b/dll/win32/shell32/wine/shellpath.c index 5ce07129d72..6dc7227dc77 100644 --- a/dll/win32/shell32/wine/shellpath.c +++ b/dll/win32/shell32/wine/shellpath.c @@ -1201,6 +1201,7 @@ typedef enum _CSIDL_Type { CSIDL_Type_WindowsPath, CSIDL_Type_SystemPath, CSIDL_Type_SystemX86Path, + CSIDL_Type_ProgramData } CSIDL_Type; /* Cannot use #if _WIN32_WINNT >= 0x0600 because _WIN32_WINNT == 0x0600 here. */ diff --git a/sdk/include/psdk/shellapi.h b/sdk/include/psdk/shellapi.h index b92cb7690a9..c2311fcb06b 100644 --- a/sdk/include/psdk/shellapi.h +++ b/sdk/include/psdk/shellapi.h @@ -874,6 +874,22 @@ typedef enum SHSTOCKICONID SIID_MAX_ICONS = 175 } SHSTOCKICONID; +typedef enum +{ + QUNS_NOT_PRESENT = 1, + QUNS_BUSY = 2, + QUNS_RUNNING_D3D_FULL_SCREEN = 3, + QUNS_PRESENTATION_MODE = 4, + QUNS_ACCEPTS_NOTIFICATIONS = 5, + QUNS_QUIET_TIME = 6, + QUNS_APP = 7 +} QUERY_USER_NOTIFICATION_STATE; + +HRESULT +WINAPI +SHQueryUserNotificationState( + _Out_ QUERY_USER_NOTIFICATION_STATE *pquns); + #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ #if !defined(_WIN64) diff --git a/sdk/include/psdk/shlguid.h b/sdk/include/psdk/shlguid.h index 7c4bd672a99..6ae7258ce74 100644 --- a/sdk/include/psdk/shlguid.h +++ b/sdk/include/psdk/shlguid.h @@ -164,6 +164,10 @@ DEFINE_GUID(CLSID_DragDropHelper, 0x4657278a, 0x411b, 0x11d2, 0x83, 0x9a, 0x00, DEFINE_GUID(CLSID_ProgressDialog, 0xf8383852, 0xfcd3, 0x11d1, 0xa6, 0xb9, 0x0, 0x60, 0x97, 0xdf, 0x5b, 0xd4); +DEFINE_GUID(CLSID_ShellLibrary, 0xd9b3211d, 0xe57f, 0x4426, 0xaa, 0xef, 0x30, 0xa8, 0x06, 0xad, 0xd3, 0x97); + +DEFINE_GUID(CLSID_UserEventTimer, 0x864a1288, 0x354c, 0x4d19, 0x9d, 0x68, 0xc2, 0x74, 0x2b, 0xb1, 0x49, 0x97); + #define PSGUID_SHELLDETAILS {0x28636aa6, 0x953d, 0x11d2, 0xb5, 0xd6, 0x0, 0xc0, 0x4f, 0xd9, 0x18, 0xd0} DEFINE_GUID(FMTID_ShellDetails, 0x28636aa6, 0x953d, 0x11d2, 0xb5, 0xd6, 0x0, 0xc0, 0x4f, 0xd9, 0x18, 0xd0); #define PID_FINDDATA 0 diff --git a/sdk/include/psdk/shobjidl.idl b/sdk/include/psdk/shobjidl.idl index d9086b6b906..8c1fa1e63e9 100644 --- a/sdk/include/psdk/shobjidl.idl +++ b/sdk/include/psdk/shobjidl.idl @@ -4830,7 +4830,6 @@ interface IFolderBandPriv : IUnknown } -#ifdef __REACTOS__ /***************************************************************************** * IQueryContinue interface */ @@ -4847,6 +4846,166 @@ interface IQueryContinue : IUnknown } +typedef [v1_enum] enum LIBRARYFOLDERFILTER + { + LFF_FORCEFILESYSTEM = 1, + LFF_STORAGEITEMS = 2, + LFF_ALLITEMS = 3, +} LIBRARYFOLDERFILTER; + +typedef [v1_enum] enum LIBRARYOPTIONFLAGS +{ + LOF_DEFAULT = 0x00000000, + LOF_PINNEDTONAVPANE = 0x00000001, + LOF_MASK_ALL = 0x00000001, +} LIBRARYOPTIONFLAGS; + +cpp_quote("DEFINE_ENUM_FLAG_OPERATORS(LIBRARYOPTIONFLAGS)") + +typedef [v1_enum] enum DEFAULTSAVEFOLDERTYPE +{ + DSFT_DETECT = 1, + DSFT_PRIVATE, + DSFT_PUBLIC, +} DEFAULTSAVEFOLDERTYPE; + +typedef [v1_enum] enum LIBRARYSAVEFLAGS +{ + LSF_FAILIFTHERE = 0x00000000, + LSF_OVERRIDEEXISTING = 0x00000001, + LSF_MAKEUNIQUENAME = 0x00000002, +} LIBRARYSAVEFLAGS; + +cpp_quote("DEFINE_ENUM_FLAG_OPERATORS(LIBRARYSAVEFLAGS)") + + +/***************************************************************************** + * IShellLibrary interface + */ +[ + helpstring("Shell Library API"), + uuid(11a66efa-382e-451a-9234-1e0e12ef3085), + object, + pointer_default(unique) +] +interface IShellLibrary : IUnknown +{ + HRESULT AddFolder( + [in] IShellItem *psiLocation); + + HRESULT Commit(); + + HRESULT GetDefaultSaveFolder( + [in] DEFAULTSAVEFOLDERTYPE dsft, + [in] REFIID riid, + [out, iid_is(riid)] void **ppv); + + HRESULT GetFolders( + [in] LIBRARYFOLDERFILTER lff, + [in] REFIID riid, + [out, iid_is(riid)] void **ppv); + + HRESULT GetFolderType( + [out] FOLDERTYPEID *pftid); + + HRESULT GetIcon( + [out, string] LPWSTR *ppszIcon); + + HRESULT GetOptions( + [out] LIBRARYOPTIONFLAGS *plofOptions); + + HRESULT LoadLibraryFromItem( + [in] IShellItem *psiLibrary, + [in] DWORD grfMode); + + HRESULT LoadLibraryFromKnownFolder( + [in] REFKNOWNFOLDERID kfidLibrary, + [in] DWORD grfMode); + + HRESULT RemoveFolder( + [in] IShellItem *psiLocation); + + HRESULT ResolveFolder( + [in] IShellItem *psiFolderToResolve, + [in] DWORD dwTimeout, + [in] REFIID riid, + [out, iid_is(riid)] void **ppv); + + HRESULT Save( + [in] IShellItem *psiFolderToSaveIn, + [in, string] LPCWSTR pszLibraryName, + [in] LIBRARYSAVEFLAGS lsf, + [out] IShellItem **ppsiSavedTo); + + HRESULT SaveInKnownFolder( + [in] REFKNOWNFOLDERID kfidToSaveIn, + [in, string] LPCWSTR pszLibraryName, + [in] LIBRARYSAVEFLAGS lsf, + [out] IShellItem **ppsiSavedTo); + + HRESULT SetDefaultSaveFolder( + [in] DEFAULTSAVEFOLDERTYPE dsft, + [in] IShellItem *psi); + + HRESULT SetFolderType( + [in] REFFOLDERTYPEID ftid); + + HRESULT SetIcon( + [in, string] LPCWSTR pszIcon); + + HRESULT SetOptions( + [in] LIBRARYOPTIONFLAGS lofMask, + [in] LIBRARYOPTIONFLAGS lofOptions); +}; + + +/***************************************************************************** + * IUserEventTimerCallback interface + */ +[ + uuid(e9ead8e6-2a25-410e-9b58-a9fbef1dd1a2), + object, + pointer_default(unique) +] +interface IUserEventTimerCallback : IUnknown +{ + HRESULT UserEventTimerProc( + ULONG uUserEventTimerID, + UINT uTimerElapse); +}; + + +/***************************************************************************** + * IUserEventTimer interface + */ +[ + uuid(0f504b94-6e42-42e6-99e0-e20fafe52ab4), + object, + pointer_default(unique) +] +interface IUserEventTimer : IUserEventTimerCallback +{ + HRESULT SetUserEventTimer( + HWND hWnd, + UINT uCallbackMsg, + UINT uTimerElapse, + IUserEventTimerCallback *pUserEventTimerCallback, + ULONG *puUserEventTimerID); + + HRESULT KillUserEventTimer( + HWND hWnd, + ULONG uUserEventTimerID); + + HRESULT GetUserEventTimerElapsed( + HWND hWnd, + ULONG uUserEventTimerID, + UINT *puTimerElapsed); + + HRESULT InitTimerTickInterval( + UINT uTimerTickIntervalMs); +}; + + /***************************************************************************** * IUserNotification interface */ @@ -4987,4 +5146,3 @@ interface IUserAssist : IUnknown BOOL bEnable); }; -#endif // __REACTOS__