mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-08-26 19:33:31 +00:00
[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:
co-authored by
Oleb Dubinskiy
Mikhail Tyukin
parent
ccc242ed6f
commit
095860df57
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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()
|
||||
};
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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_
|
||||
@@ -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);
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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_
|
||||
@@ -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'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -961,3 +961,5 @@
|
||||
#define IDR_RECYCLEBINCLEANER 162
|
||||
#define IDR_EXPLORER 163
|
||||
#define IDR_SYSTEMFILEASSOC 164
|
||||
#define IDR_SHELLLIBRARY 165
|
||||
#define IDR_USEREVENTTIMER 166
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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.@]
|
||||
|
||||
@@ -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) \
|
||||
{\
|
||||
|
||||
@@ -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. */
|
||||
|
||||
Reference in New Issue
Block a user