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)
82#define FAILED_UNEXPECTEDLY(hr) _ROS_FAILED_HELPER((hr), #hr, __FILE__, __LINE__)
84#define FAILED_UNEXPECTEDLY(hr) FAILED(hr)
93class CComCreatorCentralInstance
127IUnknown *CComCreatorCentralInstance<T>::s_pInstance =
NULL;
129#define DECLARE_CENTRAL_INSTANCE_NOT_AGGREGATABLE(x) \
131 typedef CComCreatorCentralInstance< ATL::CComObject<x> > _CreatorClass;
135class CComDebugObject :
public Base
138 CComDebugObject(
void * =
NULL)
140#if DEBUG_CCOMOBJECT_CREATION
146 virtual ~CComDebugObject()
148 this->FinalRelease();
149 _pAtlModule->Unlock();
154 int rc = this->InternalAddRef();
155#if DEBUG_CCOMOBJECT_REFCOUNTING
163 int rc = this->InternalRelease();
165#if DEBUG_CCOMOBJECT_REFCOUNTING
171#if DEBUG_CCOMOBJECT_DESTRUCTION
181 return this->_InternalQueryInterface(iid,
ppvObject);
184 static HRESULT WINAPI CreateInstance(CComDebugObject<Base> **pp)
186 CComDebugObject<Base> *newInstance;
195 ATLTRY(newInstance =
new CComDebugObject<Base>());
196 if (newInstance !=
NULL)
198 newInstance->SetVoid(
NULL);
199 newInstance->InternalFinalConstructAddRef();
200 hResult = newInstance->_AtlInitialConstruct();
202 hResult = newInstance->FinalConstruct();
204 hResult = newInstance->_AtlFinalConstruct();
205 newInstance->InternalFinalConstructRelease();
217#ifdef DEBUG_CCOMOBJECT
218# define _CComObject CComDebugObject
220# define _CComObject CComObject
224void ReleaseCComPtrExpectZero(CComPtr<T>& cptr,
BOOL forceRelease =
FALSE)
228 T *raw = cptr.Detach();
229 int nrc = raw->Release();
232 DbgPrint(
"WARNING: Unexpected RefCount > 0 (%d)!\n", nrc);
237 nrc = raw->Release();
244template<
class T,
class R>
256 hResult =
obj->QueryInterface(
riid,
reinterpret_cast<void **
>(
ppv));
265 _CComObject<T> *pobj;
268 hResult = _CComObject<T>::CreateInstance(&pobj);
284 _CComObject<T> *pobj;
287 hResult = _CComObject<T>::CreateInstance(&pobj);
293 hResult = pobj->Initialize();
303template<
class T,
class T1>
306 _CComObject<T> *pobj;
309 hResult = _CComObject<T>::CreateInstance(&pobj);
315 hResult = pobj->Initialize(initArg1);
325template<
class T,
class T1,
class T2>
328 _CComObject<T> *pobj;
331 hResult = _CComObject<T>::CreateInstance(&pobj);
337 hResult = pobj->Initialize(initArg1, initArg2);
347template<
class T,
class T1,
class T2,
class T3>
348HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3,
REFIID riid,
void **
ppv)
350 _CComObject<T> *pobj;
353 hResult = _CComObject<T>::CreateInstance(&pobj);
359 hResult = pobj->Initialize(initArg1, initArg2, initArg3);
369template<
class T,
class T1,
class T2,
class T3,
class T4>
370HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3, T4 initArg4,
REFIID riid,
void **
ppv)
372 _CComObject<T> *pobj;
375 hResult = _CComObject<T>::CreateInstance(&pobj);
381 hResult = pobj->Initialize(initArg1, initArg2, initArg3, initArg4);
391template<
class T,
class T1,
class T2,
class T3,
class T4,
class T5>
392HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3, T4 initArg4, T5 initArg5,
REFIID riid,
void **
ppv)
394 _CComObject<T> *pobj;
397 hResult = _CComObject<T>::CreateInstance(&pobj);
403 hResult = pobj->Initialize(initArg1, initArg2, initArg3, initArg4, initArg5);
413template<
class P,
class R>
static HRESULT SHILClone(
P pidl,
R *ppOut)
452 return SHSetStrRet(pStrRet,
Buffer);
506 int cb = pcidl->mkid.cb;
512 DbgPrint(
" - WARNING: cb is not a multiple of 4\n");
513 for (
i = 0; (
i + 4) <=
cb;
i += 4)
515 DbgPrint(
" - abID[%08x]: %02x %02x %02x %02x\n",
527 DbgPrint(
" - abID[%08x]: %02x %02x %02x --\n",
535 DbgPrint(
" - abID[%08x]: %02x %02x -- --\n",
542 DbgPrint(
" - abID[%08x]: %02x -- -- --\n",
570#define S_LESSTHAN 0xffff
572#define S_GREATERTHAN S_FALSE
573#define MAKE_COMPARE_HRESULT(x) ((x)>0 ? S_GREATERTHAN : ((x)<0 ? S_LESSTHAN : S_EQUAL))
593struct CDataObjectHIDA
604 m_medium.tymed = TYMED_NULL;
606 if (g_cfHIDA ==
NULL)
610 FORMATETC
fmt = { g_cfHIDA,
NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
615 m_medium.tymed = TYMED_NULL;
620 if (m_cida ==
nullptr)
639 operator bool()
const
641 return m_cida !=
nullptr;
644 operator const CIDA* ()
const
649 const CIDA* operator->()
const
658 FORMATETC
fmt = { clipformat,
NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
659 STGMEDIUM medium = { TYMED_NULL };
668 if (
size <= dwBufferSize)
692 STGMEDIUM medium = { TYMED_HGLOBAL };
705 FORMATETC etc = { clipformat,
NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
719 if (g_cfShellIdListOffsets ==
NULL)
732 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 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)
static PCUIDLIST_ABSOLUTE HIDA_GetPIDLFolder(CIDA const *pida)
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
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)