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;
783#if defined(CMIC_MASK_UNICODE) && defined(SEE_MASK_UNICODE)
784static inline bool IsUnicode(
const CMINVOKECOMMANDINFOEX &ici)
787 return (ici.fMask & CMIC_MASK_UNICODE) && ici.cbSize >= minsize;
790static inline bool IsUnicode(
const CMINVOKECOMMANDINFO &ici)
792 return IsUnicode(*(CMINVOKECOMMANDINFOEX*)&ici);
800struct CDataObjectHIDA
811 m_hr = CreateCIDA(pDataObject, &m_cida, m_medium);
816 DestroyCIDA(m_cida, m_medium);
819 static void DestroyCIDA(
CIDA *pcida, STGMEDIUM &medium)
829 medium.pUnkForRelease =
NULL;
830 if (g_cfHIDA ==
NULL)
833 FORMATETC
fmt = { g_cfHIDA,
NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
843 medium.tymed = TYMED_NULL;
852 operator bool()
const
854 return m_cida !=
nullptr;
857 operator const CIDA* ()
const
862 const CIDA* operator->()
const
871 FORMATETC
fmt = { clipformat,
NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
872 STGMEDIUM medium = { TYMED_NULL };
881 if (
size <= dwBufferSize)
905 STGMEDIUM medium = { TYMED_HGLOBAL };
918 FORMATETC etc = { clipformat,
NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
932 if (g_cfShellIdListOffsets ==
NULL)
945 if (g_cfShellIdListOffsets ==
NULL)
956struct SHELL_GetSettingImpl
962#define SHELL_GetSetting(ssf, field) ( SHELL_GetSettingImpl(ssf)->field )
964#define SHELL_GetSetting(pss, ssf, field) ( SHGetSetSettings((pss), (ssf), FALSE), (pss)->field )
972 if (!pidl || !pidl->mkid.cb)
976 wsprintfA(
buf,
"%p [] (%s)", pidl, pidl ?
"Empty/Desktop" :
"NULL");
986 type = pidl->mkid.abID[0] & 0x7f;
987 data = (
char*)&pidl->mkid.abID[0];
992 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
void *WINAPI CoTaskMemAlloc(SIZE_T size)
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)
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 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 HRESULT QueryInterface(REFIID, void **)
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)
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
BOOL WINAPI ILRemoveLastID(LPITEMIDLIST pidl)
LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST pidl)
#define DECLSPEC_SELECTANY
#define SEE_MASK_CLASSKEY
#define SEE_MASK_CLASSNAME
VOID WINAPI SHGetSetSettings(LPSHELLSTATE lpss, DWORD dwMask, BOOL bSet)
#define DbgPrint(fmt,...)
static PCUIDLIST_RELATIVE HIDA_GetPIDLItem(CIDA const *pida, SIZE_T i)
static BOOL SHELL_IsContextMenuMsg(UINT uMsg)
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 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 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
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)