[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 <[email protected]>
Co-authored-by: Mikhail Tyukin <[email protected]>
This commit is contained in:
Justin Miller
2026-07-21 12:11:29 -07:00
committed by GitHub
co-authored by Oleb Dubinskiy Mikhail Tyukin
parent ccc242ed6f
commit 095860df57
25 changed files with 1414 additions and 92 deletions
+91
View File
@@ -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)
{
+20 -1
View File
@@ -11,7 +11,7 @@
class CTaskbarList :
public CComCoClass<CTaskbarList, &CLSID_TaskbarList>,
public CComObjectRootEx<CComMultiThreadModelNoCS>,
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()
+5
View File
@@ -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)
+286 -78
View File
@@ -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<CShellItemArray, &CLSID_NULL>,
public CComObjectRootEx<CComMultiThreadModelNoCS>,
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<IShellItem> 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<ITEMIDLIST> 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<IShellFolder> desktop;
CComPtr<IShellFolder> folder;
CComHeapPtr<ITEMIDLIST> pidlFolder;
CComHeapPtr<ITEMIDLIST> 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<LPWSTR>(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<CShellItemArray>(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<IShellItem> parent;
CComHeapPtr<ITEMIDLIST> 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<ITEMIDLIST> 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<IShellItem2> 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 */
+353
View File
@@ -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<IShellItem> 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<DWORD>(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<CSimpleShellItemArray>(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<IShellItem *> 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<IShellItem *> 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<CShellItemArray>(pdo, riid, ppv);
}
+35
View File
@@ -0,0 +1,35 @@
#pragma once
class CShellItemArray :
public CComCoClass<CShellItemArray, &CLSID_NULL>,
public CComObjectRootEx<CComMultiThreadModelNoCS>,
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()
};
+126
View File
@@ -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 ([email protected])
*/
#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;
}
+50
View File
@@ -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 ([email protected])
*/
#ifndef _CSHELLLIBRARY_H_
#define _CSHELLLIBRARY_H_
class CShellLibrary :
public CComCoClass<CShellLibrary, &CLSID_ShellLibrary>,
public CComObjectRootEx<CComMultiThreadModelNoCS>,
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_
+35
View File
@@ -0,0 +1,35 @@
#pragma once
class CSimpleShellItemArray :
public CComCoClass<CSimpleShellItemArray, &CLSID_NULL>,
public CComObjectRootEx<CComMultiThreadModelNoCS>,
public IShellItemArray
{
CAtlArray<CComPtr<IShellItem>> 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);
+56
View File
@@ -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 ([email protected])
*/
#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;
}
+40
View File
@@ -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 ([email protected])
*/
#ifndef _CUSEREVENTTIMER_H_
#define _CUSEREVENTTIMER_H_
class CUserEventTimer :
public CComCoClass<CUserEventTimer, &CLSID_UserEventTimer>,
public CComObjectRootEx<CComMultiThreadModelNoCS>,
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_
+4
View File
@@ -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"
@@ -0,0 +1,13 @@
HKCR
{
NoRemove CLSID
{
ForceRemove {D9B3211D-E57F-4426-AAEF-30A806ADD397} = s 'Shell Library API'
{
InprocServer32 = s '%MODULE%'
{
val ThreadingModel = s 'Both'
}
}
}
}
@@ -0,0 +1,13 @@
HKCR
{
NoRemove CLSID
{
ForceRemove {864A1288-354C-4D19-9D68-C2742BB14997} = s 'User Event Timer'
{
InprocServer32 = s '%MODULE%'
{
val ThreadingModel = s 'Apartment'
}
}
}
}
+2
View File
@@ -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"
+2
View File
@@ -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;
+36 -11
View File
@@ -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)
+2
View File
@@ -961,3 +961,5 @@
#define IDR_RECYCLEBINCLEANER 162
#define IDR_EXPLORER 163
#define IDR_SYSTEMFILEASSOC 164
#define IDR_SHELLLIBRARY 165
#define IDR_USEREVENTTIMER 166
+59
View File
@@ -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;
}
+2
View File
@@ -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.@]
+3
View File
@@ -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) \
{\
+1
View File
@@ -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. */