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
129class CComCreatorCentralInstance
163IUnknown *CComCreatorCentralInstance<T>::s_pInstance =
NULL;
165#define DECLARE_CENTRAL_INSTANCE_NOT_AGGREGATABLE(x) \
167 typedef CComCreatorCentralInstance< ATL::CComObject<x> > _CreatorClass;
171class CComDebugObject :
public Base
174 CComDebugObject(
void * =
NULL)
176#if DEBUG_CCOMOBJECT_CREATION
182 virtual ~CComDebugObject()
184 this->FinalRelease();
185 _pAtlModule->Unlock();
190 int rc = this->InternalAddRef();
191#if DEBUG_CCOMOBJECT_REFCOUNTING
199 int rc = this->InternalRelease();
201#if DEBUG_CCOMOBJECT_REFCOUNTING
207#if DEBUG_CCOMOBJECT_DESTRUCTION
217 return this->_InternalQueryInterface(iid,
ppvObject);
220 static HRESULT WINAPI CreateInstance(CComDebugObject<Base> **pp)
222 CComDebugObject<Base> *newInstance;
231 ATLTRY(newInstance =
new CComDebugObject<Base>());
232 if (newInstance !=
NULL)
234 newInstance->SetVoid(
NULL);
235 newInstance->InternalFinalConstructAddRef();
236 hResult = newInstance->_AtlInitialConstruct();
238 hResult = newInstance->FinalConstruct();
240 hResult = newInstance->_AtlFinalConstruct();
241 newInstance->InternalFinalConstructRelease();
253#ifdef DEBUG_CCOMOBJECT
254# define _CComObject CComDebugObject
256# define _CComObject CComObject
265 T *raw = cptr.Detach();
266 int nrc =
r = raw->Release();
269 while (nrc > 0 && forceRelease)
271 nrc = raw->Release();
276#define ReleaseCComPtrExpectZero(...) ReleaseCComPtrExpectZeroHelper(__FILE__, __LINE__, __VA_ARGS__)
278template<
class T,
class R>
290 hResult =
obj->QueryInterface(
riid,
reinterpret_cast<void **
>(
ppv));
299 _CComObject<T> *pobj;
302 hResult = _CComObject<T>::CreateInstance(&pobj);
318 _CComObject<T> *pobj;
321 hResult = _CComObject<T>::CreateInstance(&pobj);
327 hResult = pobj->Initialize();
337template<
class T,
class T1>
340 _CComObject<T> *pobj;
343 hResult = _CComObject<T>::CreateInstance(&pobj);
349 hResult = pobj->Initialize(initArg1);
359template<
class T,
class T1,
class T2>
362 _CComObject<T> *pobj;
365 hResult = _CComObject<T>::CreateInstance(&pobj);
371 hResult = pobj->Initialize(initArg1, initArg2);
381template<
class T,
class T1,
class T2,
class T3>
382HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3,
REFIID riid,
void **
ppv)
384 _CComObject<T> *pobj;
387 hResult = _CComObject<T>::CreateInstance(&pobj);
393 hResult = pobj->Initialize(initArg1, initArg2, initArg3);
403template<
class T,
class T1,
class T2,
class T3,
class T4>
404HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3, T4 initArg4,
REFIID riid,
void **
ppv)
406 _CComObject<T> *pobj;
409 hResult = _CComObject<T>::CreateInstance(&pobj);
415 hResult = pobj->Initialize(initArg1, initArg2, initArg3, initArg4);
425template<
class T,
class T1,
class T2,
class T3,
class T4,
class T5>
426HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3, T4 initArg4, T5 initArg5,
REFIID riid,
void **
ppv)
428 _CComObject<T> *pobj;
431 hResult = _CComObject<T>::CreateInstance(&pobj);
437 hResult = pobj->Initialize(initArg1, initArg2, initArg3, initArg4, initArg5);
459static inline bool StrIsNullOrEmpty(
LPCSTR str) {
return !
str || !*
str; }
489 return SHSetStrRet(pStrRet,
Buffer);
543 int cb = pcidl->mkid.cb;
549 DbgPrint(
" - WARNING: cb is not a multiple of 4\n");
550 for (
i = 0; (
i + 4) <=
cb;
i += 4)
552 DbgPrint(
" - abID[%08x]: %02x %02x %02x %02x\n",
564 DbgPrint(
" - abID[%08x]: %02x %02x %02x --\n",
572 DbgPrint(
" - abID[%08x]: %02x %02x -- --\n",
579 DbgPrint(
" - abID[%08x]: %02x -- -- --\n",
607#define S_LESSTHAN 0xffff
609#define S_GREATERTHAN S_FALSE
610#define MAKE_COMPARE_HRESULT(x) ((x)>0 ? S_GREATERTHAN : ((x)<0 ? S_LESSTHAN : S_EQUAL))
634struct CDataObjectHIDA
645 m_hr = CreateCIDA(pDataObject, &m_cida, m_medium);
650 DestroyCIDA(m_cida, m_medium);
653 static void DestroyCIDA(
CIDA *pcida, STGMEDIUM &medium)
663 medium.pUnkForRelease =
NULL;
664 if (g_cfHIDA ==
NULL)
667 FORMATETC
fmt = { g_cfHIDA,
NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
677 medium.tymed = TYMED_NULL;
686 operator bool()
const
688 return m_cida !=
nullptr;
691 operator const CIDA* ()
const
696 const CIDA* operator->()
const
705 FORMATETC
fmt = { clipformat,
NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
706 STGMEDIUM medium = { TYMED_NULL };
715 if (
size <= dwBufferSize)
739 STGMEDIUM medium = { TYMED_HGLOBAL };
752 FORMATETC etc = { clipformat,
NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
766 if (g_cfShellIdListOffsets ==
NULL)
779 if (g_cfShellIdListOffsets ==
NULL)
790struct SHELL_GetSettingImpl
796#define SHELL_GetSetting(ssf, field) ( SHELL_GetSettingImpl(ssf)->field )
798#define SHELL_GetSetting(pss, ssf, field) ( SHGetSetSettings((pss), (ssf), FALSE), (pss)->field )
char * strcpy(char *DstString, const char *SrcString)
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)
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
void WINAPI ReleaseStgMedium(STGMEDIUM *pmedium)
HRESULT SHILClone(_In_opt_ LPCITEMIDLIST pidl, _Outptr_ LPITEMIDLIST *ppidl)
GLuint GLuint GLsizei count
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)
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)
nsresult QueryInterface(nsIIDRef riid, void **result)
#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
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
_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)
ULONG Win32DbgPrint(const char *filename, int line, const char *lpFormat,...)
#define DbgPrint(fmt,...)
static PCUIDLIST_RELATIVE HIDA_GetPIDLItem(CIDA const *pida, SIZE_T i)
HRESULT HResultFromWin32(DWORD hr)
static PCUIDLIST_ABSOLUTE HIDA_GetPIDLFolder(CIDA const *pida)
static UINT SHELL_ErrorBoxHelper(HWND hwndOwner, UINT Error)
static BOOL ILIsSingle(LPCITEMIDLIST pidl)
BOOL _ROS_FAILED_HELPER(HRESULT hr, const char *expr, const char *filename, int line)
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
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)
BOOL WINAPI GetMenuItemInfoW(_In_ HMENU, _In_ UINT, _In_ BOOL, _Inout_ LPMENUITEMINFOW)
BOOL WINAPI IsWindowVisible(_In_ HWND)