reactos/dll/win32/browseui/utility.cpp

74 lines
1.8 KiB
C++
Raw Normal View History

#include "precomp.h"
#ifndef SHCIDS_CANONICALONLY
#define SHCIDS_CANONICALONLY 0x10000000L
#endif
void *operator new(size_t size)
{
return LocalAlloc(LMEM_ZEROINIT, size);
}
void operator delete(void *p)
{
LocalFree(p);
}
void operator delete(void *p, UINT_PTR)
{
LocalFree(p);
}
HRESULT SHELL_GetIDListFromObject(IUnknown *punk, PIDLIST_ABSOLUTE *ppidl)
{
#if DLL_EXPORT_VERSION >= _WIN32_WINNT_VISTA && 0 // FIXME: SHELL32 not ready yet
return SHGetIDListFromObject(punk, ppidl);
#else
HRESULT hr;
IPersistFolder2 *pf2;
if (SUCCEEDED(hr = punk->QueryInterface(IID_PPV_ARG(IPersistFolder2, &pf2))))
{
hr = pf2->GetCurFolder(ppidl);
pf2->Release();
}
IPersistIDList *pil;
if (FAILED(hr) && SUCCEEDED(hr = punk->QueryInterface(IID_PPV_ARG(IPersistIDList, &pil))))
{
hr = pil->GetIDList(ppidl);
pil->Release();
}
return hr;
#endif
}
static HRESULT SHELL_CompareAbsoluteIDs(LPARAM lParam, PCIDLIST_ABSOLUTE a, PCIDLIST_ABSOLUTE b)
{
IShellFolder *psf;
HRESULT hr = SHGetDesktopFolder(&psf);
if (FAILED(hr))
return hr;
hr = psf->CompareIDs(lParam, a, b);
psf->Release();
return hr;
}
BOOL SHELL_IsEqualAbsoluteID(PCIDLIST_ABSOLUTE a, PCIDLIST_ABSOLUTE b)
{
return !SHELL_CompareAbsoluteIDs(SHCIDS_CANONICALONLY, a, b);
}
BOOL SHELL_IsVerb(IContextMenu *pcm, UINT_PTR idCmd, LPCWSTR Verb)
{
HRESULT hr;
WCHAR wide[MAX_PATH];
if (SUCCEEDED(hr = pcm->GetCommandString(idCmd, GCS_VERBW, NULL, (LPSTR)wide, _countof(wide))))
return !lstrcmpiW(wide, Verb);
CHAR ansi[_countof(wide)], buf[MAX_PATH];
if (SHUnicodeToAnsi(Verb, buf, _countof(buf)))
{
if (SUCCEEDED(hr = pcm->GetCommandString(idCmd, GCS_VERBA, NULL, ansi, _countof(ansi))))
return !lstrcmpiA(ansi, buf);
}
return FALSE;
}