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)
99class CComCreatorCentralInstance
133IUnknown *CComCreatorCentralInstance<T>::s_pInstance =
NULL;
135#define DECLARE_CENTRAL_INSTANCE_NOT_AGGREGATABLE(x) \
137 typedef CComCreatorCentralInstance< ATL::CComObject<x> > _CreatorClass;
141class CComDebugObject :
public Base
144 CComDebugObject(
void * =
NULL)
146#if DEBUG_CCOMOBJECT_CREATION
152 virtual ~CComDebugObject()
154 this->FinalRelease();
155 _pAtlModule->Unlock();
160 int rc = this->InternalAddRef();
161#if DEBUG_CCOMOBJECT_REFCOUNTING
169 int rc = this->InternalRelease();
171#if DEBUG_CCOMOBJECT_REFCOUNTING
177#if DEBUG_CCOMOBJECT_DESTRUCTION
187 return this->_InternalQueryInterface(iid,
ppvObject);
190 static HRESULT WINAPI CreateInstance(CComDebugObject<Base> **pp)
192 CComDebugObject<Base> *newInstance;
201 ATLTRY(newInstance =
new CComDebugObject<Base>());
202 if (newInstance !=
NULL)
204 newInstance->SetVoid(
NULL);
205 newInstance->InternalFinalConstructAddRef();
206 hResult = newInstance->_AtlInitialConstruct();
208 hResult = newInstance->FinalConstruct();
210 hResult = newInstance->_AtlFinalConstruct();
211 newInstance->InternalFinalConstructRelease();
223#ifdef DEBUG_CCOMOBJECT
224# define _CComObject CComDebugObject
226# define _CComObject CComObject
235 T *raw = cptr.Detach();
236 int nrc =
r = raw->Release();
239 while (nrc > 0 && forceRelease)
241 nrc = raw->Release();
246#define ReleaseCComPtrExpectZero(...) ReleaseCComPtrExpectZeroHelper(__FILE__, __LINE__, __VA_ARGS__)
248template<
class T,
class R>
260 hResult =
obj->QueryInterface(
riid,
reinterpret_cast<void **
>(
ppv));
269 _CComObject<T> *pobj;
272 hResult = _CComObject<T>::CreateInstance(&pobj);
288 _CComObject<T> *pobj;
291 hResult = _CComObject<T>::CreateInstance(&pobj);
297 hResult = pobj->Initialize();
307template<
class T,
class T1>
310 _CComObject<T> *pobj;
313 hResult = _CComObject<T>::CreateInstance(&pobj);
319 hResult = pobj->Initialize(initArg1);
329template<
class T,
class T1,
class T2>
332 _CComObject<T> *pobj;
335 hResult = _CComObject<T>::CreateInstance(&pobj);
341 hResult = pobj->Initialize(initArg1, initArg2);
351template<
class T,
class T1,
class T2,
class T3>
352HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3,
REFIID riid,
void **
ppv)
354 _CComObject<T> *pobj;
357 hResult = _CComObject<T>::CreateInstance(&pobj);
363 hResult = pobj->Initialize(initArg1, initArg2, initArg3);
373template<
class T,
class T1,
class T2,
class T3,
class T4>
374HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3, T4 initArg4,
REFIID riid,
void **
ppv)
376 _CComObject<T> *pobj;
379 hResult = _CComObject<T>::CreateInstance(&pobj);
385 hResult = pobj->Initialize(initArg1, initArg2, initArg3, initArg4);
395template<
class T,
class T1,
class T2,
class T3,
class T4,
class T5>
396HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3, T4 initArg4, T5 initArg5,
REFIID riid,
void **
ppv)
398 _CComObject<T> *pobj;
401 hResult = _CComObject<T>::CreateInstance(&pobj);
407 hResult = pobj->Initialize(initArg1, initArg2, initArg3, initArg4, initArg5);
417template<
class P,
class R>
static HRESULT SHILClone(
P pidl,
R *ppOut)
456 return SHSetStrRet(pStrRet,
Buffer);
510 int cb = pcidl->mkid.cb;
516 DbgPrint(
" - WARNING: cb is not a multiple of 4\n");
517 for (
i = 0; (
i + 4) <=
cb;
i += 4)
519 DbgPrint(
" - abID[%08x]: %02x %02x %02x %02x\n",
531 DbgPrint(
" - abID[%08x]: %02x %02x %02x --\n",
539 DbgPrint(
" - abID[%08x]: %02x %02x -- --\n",
546 DbgPrint(
" - abID[%08x]: %02x -- -- --\n",
574#define S_LESSTHAN 0xffff
576#define S_GREATERTHAN S_FALSE
577#define MAKE_COMPARE_HRESULT(x) ((x)>0 ? S_GREATERTHAN : ((x)<0 ? S_LESSTHAN : S_EQUAL))
601struct CDataObjectHIDA
612 m_medium.tymed = TYMED_NULL;
614 if (g_cfHIDA ==
NULL)
618 FORMATETC
fmt = { g_cfHIDA,
NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
623 m_medium.tymed = TYMED_NULL;
628 if (m_cida ==
nullptr)
647 operator bool()
const
649 return m_cida !=
nullptr;
652 operator const CIDA* ()
const
657 const CIDA* operator->()
const
666 FORMATETC
fmt = { clipformat,
NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
667 STGMEDIUM medium = { TYMED_NULL };
676 if (
size <= dwBufferSize)
700 STGMEDIUM medium = { TYMED_HGLOBAL };
713 FORMATETC etc = { clipformat,
NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
727 if (g_cfShellIdListOffsets ==
NULL)
740 if (g_cfShellIdListOffsets ==
NULL)
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)
GLuint GLuint GLsizei count
GLdouble GLdouble GLdouble r
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)
#define InterlockedCompareExchangePointer
#define sprintf(buf, format,...)
static const WCHAR label[]
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)
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 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
_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)
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)
UINT WINAPI RegisterClipboardFormatW(_In_ LPCWSTR)
BOOL WINAPI GetMenuItemInfoW(_In_ HMENU, _In_ UINT, _In_ BOOL, _Inout_ LPMENUITEMINFOW)