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
230void ReleaseCComPtrExpectZero(CComPtr<T>& cptr,
BOOL forceRelease =
FALSE)
234 T *raw = cptr.Detach();
235 int nrc = raw->Release();
238 DbgPrint(
"WARNING: Unexpected RefCount > 0 (%d)!\n", nrc);
243 nrc = raw->Release();
250template<
class T,
class R>
262 hResult =
obj->QueryInterface(
riid,
reinterpret_cast<void **
>(
ppv));
271 _CComObject<T> *pobj;
274 hResult = _CComObject<T>::CreateInstance(&pobj);
290 _CComObject<T> *pobj;
293 hResult = _CComObject<T>::CreateInstance(&pobj);
299 hResult = pobj->Initialize();
309template<
class T,
class T1>
312 _CComObject<T> *pobj;
315 hResult = _CComObject<T>::CreateInstance(&pobj);
321 hResult = pobj->Initialize(initArg1);
331template<
class T,
class T1,
class T2>
334 _CComObject<T> *pobj;
337 hResult = _CComObject<T>::CreateInstance(&pobj);
343 hResult = pobj->Initialize(initArg1, initArg2);
353template<
class T,
class T1,
class T2,
class T3>
354HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3,
REFIID riid,
void **
ppv)
356 _CComObject<T> *pobj;
359 hResult = _CComObject<T>::CreateInstance(&pobj);
365 hResult = pobj->Initialize(initArg1, initArg2, initArg3);
375template<
class T,
class T1,
class T2,
class T3,
class T4>
376HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3, T4 initArg4,
REFIID riid,
void **
ppv)
378 _CComObject<T> *pobj;
381 hResult = _CComObject<T>::CreateInstance(&pobj);
387 hResult = pobj->Initialize(initArg1, initArg2, initArg3, initArg4);
397template<
class T,
class T1,
class T2,
class T3,
class T4,
class T5>
398HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3, T4 initArg4, T5 initArg5,
REFIID riid,
void **
ppv)
400 _CComObject<T> *pobj;
403 hResult = _CComObject<T>::CreateInstance(&pobj);
409 hResult = pobj->Initialize(initArg1, initArg2, initArg3, initArg4, initArg5);
419template<
class P,
class R>
static HRESULT SHILClone(
P pidl,
R *ppOut)
458 return SHSetStrRet(pStrRet,
Buffer);
512 int cb = pcidl->mkid.cb;
518 DbgPrint(
" - WARNING: cb is not a multiple of 4\n");
519 for (
i = 0; (
i + 4) <=
cb;
i += 4)
521 DbgPrint(
" - abID[%08x]: %02x %02x %02x %02x\n",
533 DbgPrint(
" - abID[%08x]: %02x %02x %02x --\n",
541 DbgPrint(
" - abID[%08x]: %02x %02x -- --\n",
548 DbgPrint(
" - abID[%08x]: %02x -- -- --\n",
576#define S_LESSTHAN 0xffff
578#define S_GREATERTHAN S_FALSE
579#define MAKE_COMPARE_HRESULT(x) ((x)>0 ? S_GREATERTHAN : ((x)<0 ? S_LESSTHAN : S_EQUAL))
603struct CDataObjectHIDA
614 m_medium.tymed = TYMED_NULL;
616 if (g_cfHIDA ==
NULL)
620 FORMATETC
fmt = { g_cfHIDA,
NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
625 m_medium.tymed = TYMED_NULL;
630 if (m_cida ==
nullptr)
649 operator bool()
const
651 return m_cida !=
nullptr;
654 operator const CIDA* ()
const
659 const CIDA* operator->()
const
668 FORMATETC
fmt = { clipformat,
NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
669 STGMEDIUM medium = { TYMED_NULL };
678 if (
size <= dwBufferSize)
702 STGMEDIUM medium = { TYMED_HGLOBAL };
715 FORMATETC etc = { clipformat,
NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
729 if (g_cfShellIdListOffsets ==
NULL)
742 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)