19#ifndef __ROS_SHELL_UTILS_H
20#define __ROS_SHELL_UTILS_H
47 szMsgStart = szMsg +
sprintf(szMsg,
"%s:%d: ", fname,
line);
59#define DbgPrint(fmt, ...) \
60 Win32DbgPrint(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
63# define IID_PPV_ARG(Itype, ppType) IID_##Itype, reinterpret_cast<void**>((static_cast<Itype**>(ppType)))
64# define IID_NULL_PPV_ARG(Itype, ppType) IID_##Itype, NULL, reinterpret_cast<void**>((static_cast<Itype**>(ppType)))
66# define IID_PPV_ARG(Itype, ppType) &IID_##Itype, (void**)(ppType)
67# define IID_NULL_PPV_ARG(Itype, ppType) &IID_##Itype, NULL, (void**)(ppType)
88#define FAILED_UNEXPECTEDLY(hr) _ROS_FAILED_HELPER((hr), #hr, __FILE__, __LINE__)
90#define FAILED_UNEXPECTEDLY(hr) FAILED(hr)
112 enum { user32_IDS_ERROR = 2 };
120template<
class H>
static UINT
126#define SHELL_ErrorBox SHELL_ErrorBoxHelper
132#ifndef SRRF_RT_REG_SZ
147#if _SHELL32_ || _SHLWAPI_
148template<
class T>
static HRESULT
151#ifndef SRRF_RT_REG_SZ
180 return SHELL_RegGetValueAlloc(
hKey, pszPath, pszName, pszOut,
SRRF, pType);
184#ifdef DECLARE_CLASSFACTORY
186class CComCreatorCentralInstance
220IUnknown *CComCreatorCentralInstance<T>::s_pInstance =
NULL;
222#define DECLARE_CENTRAL_INSTANCE_NOT_AGGREGATABLE(x) \
224 typedef CComCreatorCentralInstance< ATL::CComObject<x> > _CreatorClass;
228class CComDebugObject :
public Base
231 CComDebugObject(
void * =
NULL)
233#if DEBUG_CCOMOBJECT_CREATION
239 virtual ~CComDebugObject()
241 this->FinalRelease();
242 _pAtlModule->Unlock();
247 int rc = this->InternalAddRef();
248#if DEBUG_CCOMOBJECT_REFCOUNTING
256 int rc = this->InternalRelease();
258#if DEBUG_CCOMOBJECT_REFCOUNTING
264#if DEBUG_CCOMOBJECT_DESTRUCTION
274 return this->_InternalQueryInterface(iid, ppvObject);
279 CComDebugObject<Base> *newInstance;
288 ATLTRY(newInstance =
new CComDebugObject<Base>());
289 if (newInstance !=
NULL)
291 newInstance->SetVoid(
NULL);
292 newInstance->InternalFinalConstructAddRef();
293 hResult = newInstance->_AtlInitialConstruct();
295 hResult = newInstance->FinalConstruct();
297 hResult = newInstance->_AtlFinalConstruct();
298 newInstance->InternalFinalConstructRelease();
310#ifdef DEBUG_CCOMOBJECT
311# define _CComObject CComDebugObject
313# define _CComObject CComObject
322 T *raw = cptr.Detach();
323 int nrc =
r = raw->Release();
326 while (nrc > 0 && forceRelease)
328 nrc = raw->Release();
333#define ReleaseCComPtrExpectZero(...) ReleaseCComPtrExpectZeroHelper(__FILE__, __LINE__, __VA_ARGS__)
335template<
class T,
class R>
347 hResult =
obj->QueryInterface(
riid,
reinterpret_cast<void **
>(
ppv));
354HRESULT inline ShellObjectCreator(CComPtr<T> &objref)
356 _CComObject<T> *pobj;
357 HRESULT hResult = _CComObject<T>::CreateInstance(&pobj);
367 _CComObject<T> *pobj;
370 hResult = _CComObject<T>::CreateInstance(&pobj);
386 _CComObject<T> *pobj;
389 hResult = _CComObject<T>::CreateInstance(&pobj);
395 hResult = pobj->Initialize();
405template<
class T,
class T1>
408 _CComObject<T> *pobj;
411 hResult = _CComObject<T>::CreateInstance(&pobj);
417 hResult = pobj->Initialize(initArg1);
427template<
class T,
class T1,
class T2>
430 _CComObject<T> *pobj;
433 hResult = _CComObject<T>::CreateInstance(&pobj);
439 hResult = pobj->Initialize(initArg1, initArg2);
449template<
class T,
class T1,
class T2,
class T3>
450HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3,
REFIID riid,
void **
ppv)
452 _CComObject<T> *pobj;
455 hResult = _CComObject<T>::CreateInstance(&pobj);
461 hResult = pobj->Initialize(initArg1, initArg2, initArg3);
471template<
class T,
class T1,
class T2,
class T3,
class T4>
472HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3, T4 initArg4,
REFIID riid,
void **
ppv)
474 _CComObject<T> *pobj;
477 hResult = _CComObject<T>::CreateInstance(&pobj);
483 hResult = pobj->Initialize(initArg1, initArg2, initArg3, initArg4);
493template<
class T,
class T1,
class T2,
class T3,
class T4,
class T5>
494HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3, T4 initArg4, T5 initArg5,
REFIID riid,
void **
ppv)
496 _CComObject<T> *pobj;
499 hResult = _CComObject<T>::CreateInstance(&pobj);
505 hResult = pobj->Initialize(initArg1, initArg2, initArg3, initArg4, initArg5);
536static inline bool StrIsNullOrEmpty(
LPCSTR str) {
return !
str || !*
str; }
542 pStrRet->
cStr[0] =
'\0';
573 return SHSetStrRet(pStrRet,
Buffer);
627 int cb = pcidl->mkid.cb;
633 DbgPrint(
" - WARNING: cb is not a multiple of 4\n");
634 for (
i = 0; (
i + 4) <=
cb;
i += 4)
636 DbgPrint(
" - abID[%08x]: %02x %02x %02x %02x\n",
648 DbgPrint(
" - abID[%08x]: %02x %02x %02x --\n",
656 DbgPrint(
" - abID[%08x]: %02x %02x -- --\n",
663 DbgPrint(
" - abID[%08x]: %02x -- -- --\n",
673template <HRESULT (WINAPI *InitFunc)(
void*),
void (WINAPI *UninitFunc)()>
677 CCoInitBase() :
hr(InitFunc(
NULL)) { }
684typedef CCoInitBase<CoInitialize, CoUninitialize> CCoInit;
685typedef CCoInitBase<OleInitialize, OleUninitialize> COleInit;
687class CObjectWithSiteBase :
693 CObjectWithSiteBase() : m_pUnkSite(
NULL) {}
699#if defined(__WINE_SHLWAPI_H) && !defined(NO_SHLWAPI)
705 m_pUnkSite = pUnkSite;
718#if defined(_INC_SHLWAPI) && !defined(NO_SHLWAPI)
719struct CScopedSetObjectWithSite
722 explicit CScopedSetObjectWithSite(
IUnknown *pObj,
IUnknown *pSite) : m_pObj(pObj)
729 ~CScopedSetObjectWithSite()
737#define S_LESSTHAN 0xffff
739#define S_GREATERTHAN S_FALSE
740#define MAKE_COMPARE_HRESULT(x) ((x)>0 ? S_GREATERTHAN : ((x)<0 ? S_LESSTHAN : S_EQUAL))
744#define SEE_CMIC_COMMON_BASICFLAGS (SEE_MASK_NOASYNC | SEE_MASK_ASYNCOK | SEE_MASK_UNICODE | \
745 SEE_MASK_NO_CONSOLE | SEE_MASK_FLAG_NO_UI | SEE_MASK_FLAG_SEPVDM | \
746 SEE_MASK_FLAG_LOG_USAGE | SEE_MASK_NOZONECHECKS)
747#define SEE_CMIC_COMMON_FLAGS (SEE_CMIC_COMMON_BASICFLAGS | SEE_MASK_HOTKEY | SEE_MASK_ICON | \
748 SEE_MASK_HASLINKNAME | SEE_MASK_HASTITLE)
750#define CmicFlagsToSeeFlags(flags) ((flags) & SEE_CMIC_COMMON_FLAGS)
755 return flags & SEE_CMIC_COMMON_FLAGS;
809#if defined(_INC_SHLWAPI) || defined(_SHLWAPI_)
825 HRESULT hr = SHELL_GetDisplayNameOf(psf, pidlChild, SHGDN_FORPARSING, &
path);
840#if defined(CMIC_MASK_UNICODE) && defined(SEE_MASK_UNICODE)
841static inline bool IsUnicode(
const CMINVOKECOMMANDINFOEX &ici)
844 return (ici.fMask & CMIC_MASK_UNICODE) && ici.cbSize >= minsize;
847static inline bool IsUnicode(
const CMINVOKECOMMANDINFO &ici)
849 return IsUnicode(*(CMINVOKECOMMANDINFOEX*)&ici);
857struct CDataObjectHIDA
868 m_hr = CreateCIDA(pDataObject, &m_cida, m_medium);
873 DestroyCIDA(m_cida, m_medium);
876 static void DestroyCIDA(
CIDA *pcida, STGMEDIUM &medium)
886 medium.pUnkForRelease =
NULL;
887 if (g_cfHIDA ==
NULL)
890 FORMATETC
fmt = { g_cfHIDA,
NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
900 medium.tymed = TYMED_NULL;
909 operator bool()
const
911 return m_cida !=
nullptr;
914 operator const CIDA* ()
const
919 const CIDA* operator->()
const
928 FORMATETC
fmt = { clipformat,
NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
929 STGMEDIUM medium = { TYMED_NULL };
938 if (
size <= dwBufferSize)
962 STGMEDIUM medium = { TYMED_HGLOBAL };
975 FORMATETC etc = { clipformat,
NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
989 if (g_cfShellIdListOffsets ==
NULL)
1002 if (g_cfShellIdListOffsets ==
NULL)
1013struct SHELL_GetSettingImpl
1019#define SHELL_GetSetting(ssf, field) ( SHELL_GetSettingImpl(ssf)->field )
1021#define SHELL_GetSetting(pss, ssf, field) ( SHGetSetSettings((pss), (ssf), FALSE), (pss)->field )
1029 if (!pidl || !pidl->mkid.cb)
1033 wsprintfA(
buf,
"%p [] (%s)", pidl, pidl ?
"Empty/Desktop" :
"NULL");
1043 type = pidl->mkid.abID[0] & 0x7f;
1044 data = (
char*)&pidl->mkid.abID[0];
1045 if (
depth == 0 &&
type == 0x1f && pidl->mkid.cb == 20 && *(
UINT*)(&
data[2]) == 0x20D04FE0)
1049 else if (
depth == 1 &&
type >= 0x20 && type < 0x30 && type != 0x2E && pidl->mkid.cb > 4)
static HRESULT WINAPI CreateInstance(void *pv, REFIID riid, LPVOID *ppv)
static LSTATUS(WINAPI *pRegDeleteTreeW)(HKEY
_Check_return_ _In_ PQUERY_INTERFACE QueryInterface
_In_ D3DDDI_VIDEO_PRESENT_TARGET_ID _In_ ULONG _In_ ULONG Flags
void *WINAPI CoTaskMemAlloc(SIZE_T size)
void WINAPI CoTaskMemFree(void *ptr)
static HRESULT WINAPI DataObject_GetData(LPDATAOBJECT iface, LPFORMATETC pformatetcIn, STGMEDIUM *pmedium)
static HRESULT WINAPI DataObject_SetData(LPDATAOBJECT iface, LPFORMATETC pformatetc, STGMEDIUM *pmedium, BOOL fRelease)
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
_ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl vsprintf(char *, const char *, va_list) __WINE_CRT_PRINTF_ATTR(2
_ACRTIMP char *__cdecl strrchr(const char *, int)
void WINAPI ReleaseStgMedium(STGMEDIUM *pmedium)
void WINAPI IUnknown_Set(IUnknown **dest, IUnknown *src)
HRESULT WINAPI IUnknown_SetSite(IUnknown *obj, IUnknown *site)
void WINAPI SHFree(LPVOID pv)
LPVOID WINAPI SHAlloc(SIZE_T len)
HRESULT WINAPI StrRetToStrW(LPSTRRET lpStrRet, const ITEMIDLIST *pidl, LPWSTR *ppszName)
static IShellFolder IShellItem **static IBindCtx LPITEMIDLIST SFGAOF
GLint GLint GLsizei GLsizei GLsizei depth
GLuint GLuint GLsizei count
GLuint GLuint GLsizei GLenum type
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLdouble GLdouble GLdouble r
GLenum GLuint GLenum GLsizei const GLchar * buf
GLfloat GLfloat GLfloat GLfloat h
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
HGLOBAL NTAPI GlobalFree(HGLOBAL hMem)
BOOL NTAPI GlobalUnlock(HGLOBAL hMem)
HGLOBAL NTAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes)
SIZE_T NTAPI GlobalSize(HGLOBAL hMem)
void WINAPI SHIM_OBJ_NAME() OutputDebugStringA(LPCSTR lpOutputString)
static CInternetFolder * CreateInstance(void)
HRESULT SetData([in, unique] FORMATETC *pformatetc, [in, unique] STGMEDIUM *pmedium, [in] BOOL fRelease)
HRESULT GetData([in, unique] FORMATETC *pformatetcIn, [out] STGMEDIUM *pmedium)
HRESULT GetSite([in] REFIID riid, [out, iid_is(riid)] PVOID *ppvSite)
HRESULT SetSite([in] IUnknown *pUnkSite)
HRESULT GetDisplayNameOf([in] PCUITEMID_CHILD pidl, [in] SHGDNF uFlags, [out] STRRET *lpName)
HRESULT GetAttributesOf([in] UINT cidl, [in, size_is(cidl)] PCUITEMID_CHILD_ARRAY apidl, [in, out] SFGAOF *rgfInOut)
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
nsresult QueryInterface(nsIIDRef riid, void **result)
#define InterlockedCompareExchangePointer
static ERESOURCE GlobalLock
static const WCHAR label[]
static const DWORD padding[]
static ULONG WINAPI AddRef(IStream *iface)
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl)
HRESULT WINAPI SHParseDisplayName(LPCWSTR pszName, IBindCtx *pbc, LPITEMIDLIST *ppidl, SFGAOF sfgaoIn, SFGAOF *psfgaoOut)
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
BOOL WINAPI ILRemoveLastID(LPITEMIDLIST pidl)
HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCITEMIDLIST *ppidlLast)
LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST pidl)
#define DECLSPEC_SELECTANY
int WINAPI GetMenuItemCount(_In_opt_ HMENU)
int WINAPIV wsprintfW(_Out_ LPWSTR, _In_ _Printf_format_string_ LPCWSTR,...)
UINT WINAPI RegisterClipboardFormatW(_In_ LPCWSTR)
int WINAPI MessageBoxW(_In_opt_ HWND hWnd, _In_opt_ LPCWSTR lpText, _In_opt_ LPCWSTR lpCaption, _In_ UINT uType)
int WINAPIV wsprintfA(_Out_ LPSTR, _In_ _Printf_format_string_ LPCSTR,...)
BOOL WINAPI GetMenuItemInfoW(_In_ HMENU, _In_ UINT, _In_ BOOL, _Inout_ LPMENUITEMINFOW)
BOOL WINAPI IsWindowVisible(_In_ HWND)
#define SEE_MASK_CLASSKEY
#define SEE_MASK_CLASSNAME
VOID WINAPI SHGetSetSettings(LPSHELLSTATE lpss, DWORD dwMask, BOOL bSet)
#define IID_PPV_ARG(Itype, ppType)
#define DbgPrint(fmt,...)
static PCUIDLIST_RELATIVE HIDA_GetPIDLItem(CIDA const *pida, SIZE_T i)
#define FAILED_UNEXPECTEDLY(hr)
static BOOL SHELL_IsContextMenuMsg(UINT uMsg)
static SFGAOF SHELL_GetAttributesOfAbsolute(PCIDLIST_ABSOLUTE pidl, SFGAOF query)
static HRESULT SHELL_RegGetString(HKEY hKey, PCWSTR pszPath, PCWSTR pszName, PWSTR pszOut, DWORD cchMax)
static HRESULT SHELL_RegGetStringEx(HKEY hKey, PCWSTR pszPath, PCWSTR pszName, UINT SRRF, PWSTR pszOut, DWORD cchMax)
static BOOL _ROS_FAILED_HELPER(HRESULT hr, const char *expr, const char *filename, int line)
static PCUIDLIST_ABSOLUTE HIDA_GetPIDLFolder(CIDA const *pida)
static ULONG Win32DbgPrint(const char *filename, int line, const char *lpFormat,...)
static SFGAOF SHELL_GetAttributesOf(IShellFolder *psf, LPCITEMIDLIST pidlChild, SFGAOF query)
static UINT SHELL_ErrorBoxHelper(HWND hwndOwner, UINT Error)
static BOOL ILIsSingle(LPCITEMIDLIST pidl)
static void DumpIdListOneLine(LPCITEMIDLIST pidl)
static const WCHAR CFSTR_SHELLIDLISTOFFSETW[]
static const WCHAR CFSTR_SHELLIDLISTW[]
ITEMIDLIST UNALIGNED * LPITEMIDLIST
const ITEMIDLIST_ABSOLUTE UNALIGNED * PCUIDLIST_ABSOLUTE
const ITEMID_CHILD UNALIGNED * PCUITEMID_CHILD
const ITEMIDLIST_RELATIVE UNALIGNED * PCUIDLIST_RELATIVE
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
#define FIELD_OFFSET(t, f)
#define SEE_MASK_HASTITLE
#define SEE_MASK_HASLINKNAME
DWORD WINAPI GetLastError(void)
#define FORMAT_MESSAGE_IGNORE_INSERTS
#define FORMAT_MESSAGE_FROM_SYSTEM
WINSHLWAPI LSTATUS WINAPI SHRegGetValueW(HKEY, LPCWSTR, LPCWSTR, SRRF, LPDWORD, LPVOID, LPDWORD)
#define STG_E_INVALIDHANDLE
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
#define CLASS_E_NOAGGREGATION
#define ERROR_INTERNAL_ERROR