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
130#ifdef DECLARE_CLASSFACTORY
132class CComCreatorCentralInstance
166IUnknown *CComCreatorCentralInstance<T>::s_pInstance =
NULL;
168#define DECLARE_CENTRAL_INSTANCE_NOT_AGGREGATABLE(x) \
170 typedef CComCreatorCentralInstance< ATL::CComObject<x> > _CreatorClass;
174class CComDebugObject :
public Base
177 CComDebugObject(
void * =
NULL)
179#if DEBUG_CCOMOBJECT_CREATION
185 virtual ~CComDebugObject()
187 this->FinalRelease();
188 _pAtlModule->Unlock();
193 int rc = this->InternalAddRef();
194#if DEBUG_CCOMOBJECT_REFCOUNTING
202 int rc = this->InternalRelease();
204#if DEBUG_CCOMOBJECT_REFCOUNTING
210#if DEBUG_CCOMOBJECT_DESTRUCTION
220 return this->_InternalQueryInterface(iid,
ppvObject);
225 CComDebugObject<Base> *newInstance;
234 ATLTRY(newInstance =
new CComDebugObject<Base>());
235 if (newInstance !=
NULL)
237 newInstance->SetVoid(
NULL);
238 newInstance->InternalFinalConstructAddRef();
239 hResult = newInstance->_AtlInitialConstruct();
241 hResult = newInstance->FinalConstruct();
243 hResult = newInstance->_AtlFinalConstruct();
244 newInstance->InternalFinalConstructRelease();
256#ifdef DEBUG_CCOMOBJECT
257# define _CComObject CComDebugObject
259# define _CComObject CComObject
268 T *raw = cptr.Detach();
269 int nrc =
r = raw->Release();
272 while (nrc > 0 && forceRelease)
274 nrc = raw->Release();
279#define ReleaseCComPtrExpectZero(...) ReleaseCComPtrExpectZeroHelper(__FILE__, __LINE__, __VA_ARGS__)
281template<
class T,
class R>
293 hResult =
obj->QueryInterface(
riid,
reinterpret_cast<void **
>(
ppv));
300HRESULT inline ShellObjectCreator(CComPtr<T> &objref)
302 _CComObject<T> *pobj;
303 HRESULT hResult = _CComObject<T>::CreateInstance(&pobj);
313 _CComObject<T> *pobj;
316 hResult = _CComObject<T>::CreateInstance(&pobj);
332 _CComObject<T> *pobj;
335 hResult = _CComObject<T>::CreateInstance(&pobj);
341 hResult = pobj->Initialize();
351template<
class T,
class T1>
354 _CComObject<T> *pobj;
357 hResult = _CComObject<T>::CreateInstance(&pobj);
363 hResult = pobj->Initialize(initArg1);
373template<
class T,
class T1,
class T2>
376 _CComObject<T> *pobj;
379 hResult = _CComObject<T>::CreateInstance(&pobj);
385 hResult = pobj->Initialize(initArg1, initArg2);
395template<
class T,
class T1,
class T2,
class T3>
396HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3,
REFIID riid,
void **
ppv)
398 _CComObject<T> *pobj;
401 hResult = _CComObject<T>::CreateInstance(&pobj);
407 hResult = pobj->Initialize(initArg1, initArg2, initArg3);
417template<
class T,
class T1,
class T2,
class T3,
class T4>
418HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3, T4 initArg4,
REFIID riid,
void **
ppv)
420 _CComObject<T> *pobj;
423 hResult = _CComObject<T>::CreateInstance(&pobj);
429 hResult = pobj->Initialize(initArg1, initArg2, initArg3, initArg4);
439template<
class T,
class T1,
class T2,
class T3,
class T4,
class T5>
440HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3, T4 initArg4, T5 initArg5,
REFIID riid,
void **
ppv)
442 _CComObject<T> *pobj;
445 hResult = _CComObject<T>::CreateInstance(&pobj);
451 hResult = pobj->Initialize(initArg1, initArg2, initArg3, initArg4, initArg5);
474static inline bool StrIsNullOrEmpty(
LPCSTR str) {
return !
str || !*
str; }
504 return SHSetStrRet(pStrRet,
Buffer);
558 int cb = pcidl->mkid.cb;
564 DbgPrint(
" - WARNING: cb is not a multiple of 4\n");
565 for (
i = 0; (
i + 4) <=
cb;
i += 4)
567 DbgPrint(
" - abID[%08x]: %02x %02x %02x %02x\n",
579 DbgPrint(
" - abID[%08x]: %02x %02x %02x --\n",
587 DbgPrint(
" - abID[%08x]: %02x %02x -- --\n",
594 DbgPrint(
" - abID[%08x]: %02x -- -- --\n",
604template <HRESULT (WINAPI *InitFunc)(
void*),
void (WINAPI *UninitFunc)()>
608 CCoInitBase() :
hr(InitFunc(
NULL)) { }
615typedef CCoInitBase<CoInitialize, CoUninitialize> CCoInit;
616typedef CCoInitBase<OleInitialize, OleUninitialize> COleInit;
620#define S_LESSTHAN 0xffff
622#define S_GREATERTHAN S_FALSE
623#define MAKE_COMPARE_HRESULT(x) ((x)>0 ? S_GREATERTHAN : ((x)<0 ? S_LESSTHAN : S_EQUAL))
625#define SEE_CMIC_COMMON_BASICFLAGS (SEE_MASK_NOASYNC | SEE_MASK_ASYNCOK | SEE_MASK_UNICODE | \
626 SEE_MASK_NO_CONSOLE | SEE_MASK_FLAG_NO_UI | SEE_MASK_FLAG_SEPVDM | \
627 SEE_MASK_FLAG_LOG_USAGE | SEE_MASK_NOZONECHECKS)
628#define SEE_CMIC_COMMON_FLAGS (SEE_CMIC_COMMON_BASICFLAGS | SEE_MASK_HOTKEY | SEE_MASK_ICON | \
629 SEE_MASK_HASLINKNAME | SEE_MASK_HASTITLE)
649#if defined(CMIC_MASK_UNICODE) && defined(SEE_MASK_UNICODE)
650static inline bool IsUnicode(
const CMINVOKECOMMANDINFOEX &ici)
653 return (ici.fMask & CMIC_MASK_UNICODE) && ici.cbSize >= minsize;
656static inline bool IsUnicode(
const CMINVOKECOMMANDINFO &ici)
658 return IsUnicode(*(CMINVOKECOMMANDINFOEX*)&ici);
666struct CDataObjectHIDA
677 m_hr = CreateCIDA(pDataObject, &m_cida, m_medium);
682 DestroyCIDA(m_cida, m_medium);
685 static void DestroyCIDA(
CIDA *pcida, STGMEDIUM &medium)
695 medium.pUnkForRelease =
NULL;
696 if (g_cfHIDA ==
NULL)
699 FORMATETC
fmt = { g_cfHIDA,
NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
709 medium.tymed = TYMED_NULL;
718 operator bool()
const
720 return m_cida !=
nullptr;
723 operator const CIDA* ()
const
728 const CIDA* operator->()
const
737 FORMATETC
fmt = { clipformat,
NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
738 STGMEDIUM medium = { TYMED_NULL };
747 if (
size <= dwBufferSize)
771 STGMEDIUM medium = { TYMED_HGLOBAL };
784 FORMATETC etc = { clipformat,
NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
798 if (g_cfShellIdListOffsets ==
NULL)
811 if (g_cfShellIdListOffsets ==
NULL)
822struct SHELL_GetSettingImpl
828#define SHELL_GetSetting(ssf, field) ( SHELL_GetSettingImpl(ssf)->field )
830#define SHELL_GetSetting(pss, ssf, field) ( SHGetSetSettings((pss), (ssf), FALSE), (pss)->field )
838 if (!pidl || !pidl->mkid.cb)
842 wsprintfA(
buf,
"%p [] (%s)\n", pidl, pidl ?
"Empty/Desktop" :
"NULL");
852 type = pidl->mkid.abID[0] & 0x7f;
853 data = (
char*)&pidl->mkid.abID[0];
858 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 HRESULT WINAPI DataObject_GetData(LPDATAOBJECT iface, LPFORMATETC pformatetcIn, STGMEDIUM *pmedium)
static HRESULT WINAPI DataObject_SetData(LPDATAOBJECT iface, LPFORMATETC pformatetc, STGMEDIUM *pmedium, BOOL fRelease)
void WINAPI ReleaseStgMedium(STGMEDIUM *pmedium)
HRESULT SHILClone(_In_opt_ LPCITEMIDLIST pidl, _Outptr_ LPITEMIDLIST *ppidl)
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
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
LPVOID NTAPI GlobalLock(HGLOBAL hMem)
HGLOBAL NTAPI GlobalFree(HGLOBAL hMem)
BOOL NTAPI GlobalUnlock(HGLOBAL hMem)
HGLOBAL NTAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes)
SIZE_T NTAPI GlobalSize(HGLOBAL hMem)
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
void WINAPI SHIM_OBJ_NAME() OutputDebugStringA(LPCSTR lpOutputString)
int __cdecl vsprintf(char *_Dest, const char *_Format, va_list _Args)
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
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 QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
#define InterlockedCompareExchangePointer
#define sprintf(buf, format,...)
static const WCHAR label[]
static DWORD DWORD void LPSTR DWORD cch
static HMODULE MODULEINFO DWORD cb
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)
LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST pidl)
#define DECLSPEC_SELECTANY
_CRT_RESTORE_GCC_WARNINGS _CRT_DISABLE_GCC_WARNINGS _Check_return_ _CRTIMP _CONST_RETURN char *__cdecl strrchr(_In_z_ const char *_Str, _In_ int _Ch)
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 _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[]
const ITEMIDLIST_ABSOLUTE UNALIGNED * PCUIDLIST_ABSOLUTE
const ITEMIDLIST_RELATIVE UNALIGNED * PCUIDLIST_RELATIVE
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
#define FIELD_OFFSET(t, f)
DWORD WINAPI GetLastError(void)
#define FORMAT_MESSAGE_IGNORE_INSERTS
#define FORMAT_MESSAGE_FROM_SYSTEM
_In_ void _In_ PCCERT_CONTEXT _In_opt_ LPFILETIME _In_ DWORD _In_ DWORD _Outptr_opt_ void ** ppvObject
#define STG_E_INVALIDHANDLE
#define CLASS_E_NOAGGREGATION
#define HRESULT_FROM_WIN32(x)
#define ERROR_INTERNAL_ERROR
int WINAPI GetMenuItemCount(_In_opt_ HMENU)
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
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)