ReactOS 0.4.15-dev-7958-gcd0bb1a
shellutils.h
Go to the documentation of this file.
1/*
2 * Copyright 1999, 2000 Juergen Schmied
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19#ifndef __ROS_SHELL_UTILS_H
20#define __ROS_SHELL_UTILS_H
21
22#ifdef __cplusplus
23extern "C" {
24#endif /* defined(__cplusplus) */
25
26inline ULONG
27Win32DbgPrint(const char *filename, int line, const char *lpFormat, ...)
28{
29 char szMsg[512];
30 char *szMsgStart;
31 const char *fname;
32 va_list vl;
33
34 fname = strrchr(filename, '\\');
35 if (fname == NULL)
36 {
37 fname = strrchr(filename, '/');
38 if (fname != NULL)
39 fname++;
40 }
41 else
42 fname++;
43
44 if (fname == NULL)
45 fname = filename;
46
47 szMsgStart = szMsg + sprintf(szMsg, "%s:%d: ", fname, line);
48
49 va_start(vl, lpFormat);
50 vsprintf(szMsgStart, lpFormat, vl);
51 va_end(vl);
52
53 OutputDebugStringA(szMsg);
54
55 /* Return STATUS_SUCCESS, since we are supposed to mimic DbgPrint */
56 return 0;
57}
58
59#define DbgPrint(fmt, ...) \
60 Win32DbgPrint(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
61
62#ifdef __cplusplus
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)))
65#else
66# define IID_PPV_ARG(Itype, ppType) IID_##Itype, (void**)(ppType)
67# define IID_NULL_PPV_ARG(Itype, ppType) IID_##Itype, NULL, (void**)(ppType)
68#endif
69
71{
72 // HRESULT_FROM_WIN32 will evaluate its parameter twice, this function will not.
73 return HRESULT_FROM_WIN32(hr);
74}
75
76#if 1
77
78inline BOOL _ROS_FAILED_HELPER(HRESULT hr, const char* expr, const char* filename, int line)
79{
80 if (FAILED(hr))
81 {
82 Win32DbgPrint(filename, line, "Unexpected failure (%s)=%08x.\n", expr, hr);
83 return TRUE;
84 }
85 return FALSE;
86}
87
88#define FAILED_UNEXPECTEDLY(hr) _ROS_FAILED_HELPER((hr), #hr, __FILE__, __LINE__)
89#else
90#define FAILED_UNEXPECTEDLY(hr) FAILED(hr)
91#endif
92
93#ifdef __cplusplus
94} /* extern "C" */
95#endif /* defined(__cplusplus) */
96
97#ifdef __cplusplus
98template <typename T>
99class CComCreatorCentralInstance
100{
101private:
102 static IUnknown *s_pInstance;
103
104public:
105 static HRESULT WINAPI CreateInstance(void *pv, REFIID riid, LPVOID *ppv)
106 {
107 *ppv = NULL;
108 if (pv != NULL)
110 if (!s_pInstance)
111 {
112 PVOID pObj;
113 HRESULT hr;
115 if (FAILED(hr))
116 return hr;
117 if (InterlockedCompareExchangePointer((PVOID *)&s_pInstance, pObj, NULL))
118 static_cast<IUnknown *>(pObj)->Release();
119 }
120 return s_pInstance->QueryInterface(riid, ppv);
121 }
122 static void Term()
123 {
124 if (s_pInstance)
125 {
126 s_pInstance->Release();
127 s_pInstance = NULL;
128 }
129 }
130};
131
132template <typename T>
133IUnknown *CComCreatorCentralInstance<T>::s_pInstance = NULL;
134
135#define DECLARE_CENTRAL_INSTANCE_NOT_AGGREGATABLE(x) \
136public: \
137 typedef CComCreatorCentralInstance< ATL::CComObject<x> > _CreatorClass;
138
139
140template <class Base>
141class CComDebugObject : public Base
142{
143public:
144 CComDebugObject(void * = NULL)
145 {
146#if DEBUG_CCOMOBJECT_CREATION
147 DbgPrint("%S, this=%08p\n", __FUNCTION__, static_cast<Base*>(this));
148#endif
149 _pAtlModule->Lock();
150 }
151
152 virtual ~CComDebugObject()
153 {
154 this->FinalRelease();
155 _pAtlModule->Unlock();
156 }
157
159 {
160 int rc = this->InternalAddRef();
161#if DEBUG_CCOMOBJECT_REFCOUNTING
162 DbgPrint("%s, RefCount is now %d(--)!\n", __FUNCTION__, rc);
163#endif
164 return rc;
165 }
166
168 {
169 int rc = this->InternalRelease();
170
171#if DEBUG_CCOMOBJECT_REFCOUNTING
172 DbgPrint("%s, RefCount is now %d(--)!\n", __FUNCTION__, rc);
173#endif
174
175 if (rc == 0)
176 {
177#if DEBUG_CCOMOBJECT_DESTRUCTION
178 DbgPrint("%s, RefCount reached 0 Deleting!\n", __FUNCTION__);
179#endif
180 delete this;
181 }
182 return rc;
183 }
184
186 {
187 return this->_InternalQueryInterface(iid, ppvObject);
188 }
189
190 static HRESULT WINAPI CreateInstance(CComDebugObject<Base> **pp)
191 {
192 CComDebugObject<Base> *newInstance;
193 HRESULT hResult;
194
195 ATLASSERT(pp != NULL);
196 if (pp == NULL)
197 return E_POINTER;
198
199 hResult = E_OUTOFMEMORY;
200 newInstance = NULL;
201 ATLTRY(newInstance = new CComDebugObject<Base>());
202 if (newInstance != NULL)
203 {
204 newInstance->SetVoid(NULL);
205 newInstance->InternalFinalConstructAddRef();
206 hResult = newInstance->_AtlInitialConstruct();
207 if (SUCCEEDED(hResult))
208 hResult = newInstance->FinalConstruct();
209 if (SUCCEEDED(hResult))
210 hResult = newInstance->_AtlFinalConstruct();
211 newInstance->InternalFinalConstructRelease();
212 if (hResult != S_OK)
213 {
214 delete newInstance;
215 newInstance = NULL;
216 }
217 }
218 *pp = newInstance;
219 return hResult;
220 }
221};
222
223#ifdef DEBUG_CCOMOBJECT
224# define _CComObject CComDebugObject
225#else
226# define _CComObject CComObject
227#endif
228
229template<class T>
230void ReleaseCComPtrExpectZero(CComPtr<T>& cptr, BOOL forceRelease = FALSE)
231{
232 if (cptr.p != NULL)
233 {
234 T *raw = cptr.Detach();
235 int nrc = raw->Release();
236 if (nrc > 0)
237 {
238 DbgPrint("WARNING: Unexpected RefCount > 0 (%d)!\n", nrc);
239 if (forceRelease)
240 {
241 while (nrc > 0)
242 {
243 nrc = raw->Release();
244 }
245 }
246 }
247 }
248}
249
250template<class T, class R>
251HRESULT inline ShellDebugObjectCreator(REFIID riid, R ** ppv)
252{
253 CComPtr<T> obj;
254 HRESULT hResult;
255
256 if (ppv == NULL)
257 return E_POINTER;
258 *ppv = NULL;
259 ATLTRY(obj = new CComDebugObject<T>);
260 if (obj.p == NULL)
261 return E_OUTOFMEMORY;
262 hResult = obj->QueryInterface(riid, reinterpret_cast<void **>(ppv));
263 if (FAILED(hResult))
264 return hResult;
265 return S_OK;
266}
267
268template<class T>
269HRESULT inline ShellObjectCreator(REFIID riid, void ** ppv)
270{
271 _CComObject<T> *pobj;
272 HRESULT hResult;
273
274 hResult = _CComObject<T>::CreateInstance(&pobj);
275 if (FAILED(hResult))
276 return hResult;
277
278 pobj->AddRef(); /* CreateInstance returns object with 0 ref count */
279
280 hResult = pobj->QueryInterface(riid, reinterpret_cast<void **>(ppv));
281
282 pobj->Release(); /* In case of failure the object will be released */
283
284 return hResult;
285}
286
287template<class T>
288HRESULT inline ShellObjectCreatorInit(REFIID riid, void ** ppv)
289{
290 _CComObject<T> *pobj;
291 HRESULT hResult;
292
293 hResult = _CComObject<T>::CreateInstance(&pobj);
294 if (FAILED(hResult))
295 return hResult;
296
297 pobj->AddRef(); /* CreateInstance returns object with 0 ref count */
298
299 hResult = pobj->Initialize();
300
301 if (SUCCEEDED(hResult))
302 hResult = pobj->QueryInterface(riid, reinterpret_cast<void **>(ppv));
303
304 pobj->Release(); /* In case of failure the object will be released */
305
306 return hResult;
307}
308
309template<class T, class T1>
310HRESULT inline ShellObjectCreatorInit(T1 initArg1, REFIID riid, void ** ppv)
311{
312 _CComObject<T> *pobj;
313 HRESULT hResult;
314
315 hResult = _CComObject<T>::CreateInstance(&pobj);
316 if (FAILED(hResult))
317 return hResult;
318
319 pobj->AddRef(); /* CreateInstance returns object with 0 ref count */
320
321 hResult = pobj->Initialize(initArg1);
322
323 if (SUCCEEDED(hResult))
324 hResult = pobj->QueryInterface(riid, reinterpret_cast<void **>(ppv));
325
326 pobj->Release(); /* In case of failure the object will be released */
327
328 return hResult;
329}
330
331template<class T, class T1, class T2>
332HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, REFIID riid, void ** ppv)
333{
334 _CComObject<T> *pobj;
335 HRESULT hResult;
336
337 hResult = _CComObject<T>::CreateInstance(&pobj);
338 if (FAILED(hResult))
339 return hResult;
340
341 pobj->AddRef(); /* CreateInstance returns object with 0 ref count */
342
343 hResult = pobj->Initialize(initArg1, initArg2);
344
345 if (SUCCEEDED(hResult))
346 hResult = pobj->QueryInterface(riid, reinterpret_cast<void **>(ppv));
347
348 pobj->Release(); /* In case of failure the object will be released */
349
350 return hResult;
351}
352
353template<class T, class T1, class T2, class T3>
354HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3, REFIID riid, void ** ppv)
355{
356 _CComObject<T> *pobj;
357 HRESULT hResult;
358
359 hResult = _CComObject<T>::CreateInstance(&pobj);
360 if (FAILED(hResult))
361 return hResult;
362
363 pobj->AddRef(); /* CreateInstance returns object with 0 ref count */
364
365 hResult = pobj->Initialize(initArg1, initArg2, initArg3);
366
367 if (SUCCEEDED(hResult))
368 hResult = pobj->QueryInterface(riid, reinterpret_cast<void **>(ppv));
369
370 pobj->Release(); /* In case of failure the object will be released */
371
372 return hResult;
373}
374
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)
377{
378 _CComObject<T> *pobj;
379 HRESULT hResult;
380
381 hResult = _CComObject<T>::CreateInstance(&pobj);
382 if (FAILED(hResult))
383 return hResult;
384
385 pobj->AddRef(); /* CreateInstance returns object with 0 ref count */
386
387 hResult = pobj->Initialize(initArg1, initArg2, initArg3, initArg4);
388
389 if (SUCCEEDED(hResult))
390 hResult = pobj->QueryInterface(riid, reinterpret_cast<void **>(ppv));
391
392 pobj->Release(); /* In case of failure the object will be released */
393
394 return hResult;
395}
396
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)
399{
400 _CComObject<T> *pobj;
401 HRESULT hResult;
402
403 hResult = _CComObject<T>::CreateInstance(&pobj);
404 if (FAILED(hResult))
405 return hResult;
406
407 pobj->AddRef(); /* CreateInstance returns object with 0 ref count */
408
409 hResult = pobj->Initialize(initArg1, initArg2, initArg3, initArg4, initArg5);
410
411 if (SUCCEEDED(hResult))
412 hResult = pobj->QueryInterface(riid, reinterpret_cast<void **>(ppv));
413
414 pobj->Release(); /* In case of failure the object will be released */
415
416 return hResult;
417}
418
419template<class P, class R> static HRESULT SHILClone(P pidl, R *ppOut)
420{
421 R r = *ppOut = (R)ILClone((PIDLIST_RELATIVE)pidl);
422 return r ? S_OK : E_OUTOFMEMORY;
423}
424
425template<class B, class R> static HRESULT SHILCombine(B base, PCUIDLIST_RELATIVE sub, R *ppOut)
426{
427 R r = *ppOut = (R)ILCombine((PCIDLIST_ABSOLUTE)base, sub);
428 return r ? S_OK : E_OUTOFMEMORY;
429}
430
431HRESULT inline SHSetStrRet(LPSTRRET pStrRet, LPCSTR pstrValue)
432{
433 pStrRet->uType = STRRET_CSTR;
434 strcpy(pStrRet->cStr, pstrValue);
435 return S_OK;
436}
437
438HRESULT inline SHSetStrRet(LPSTRRET pStrRet, LPCWSTR pwstrValue)
439{
440 SIZE_T cchr = wcslen(pwstrValue);
441 LPWSTR buffer = static_cast<LPWSTR>(CoTaskMemAlloc((cchr + 1) * sizeof(WCHAR)));
442 if (buffer == NULL)
443 return E_OUTOFMEMORY;
444
445 pStrRet->uType = STRRET_WSTR;
446 pStrRet->pOleStr = buffer;
447 wcscpy(buffer, pwstrValue);
448 return S_OK;
449}
450
451HRESULT inline SHSetStrRet(LPSTRRET pStrRet, HINSTANCE hInstance, DWORD resId)
452{
454
455 if (!LoadStringW(hInstance, resId, Buffer, MAX_PATH))
456 return E_FAIL;
457
458 return SHSetStrRet(pStrRet, Buffer);
459}
460
461static inline void DbgDumpMenuInternal(HMENU hmenu, char* padding, int padlevel)
462{
463 WCHAR label[128];
464 int i;
466
467 padding[padlevel] = '.';
468 padding[padlevel + 1] = '.';
469 padding[padlevel + 2] = 0;
470
471 for (i = 0; i < count; i++)
472 {
473 MENUITEMINFOW mii = { 0 };
474
475 mii.cbSize = sizeof(mii);
477 mii.dwTypeData = label;
478 mii.cch = _countof(label);
479
480 GetMenuItemInfoW(hmenu, i, TRUE, &mii);
481
482 if (mii.fType & MFT_BITMAP)
483 DbgPrint("%s%2d - %08x: BITMAP %08p (state=%d, has submenu=%s)\n", padding, i, mii.wID, mii.hbmpItem, mii.fState, mii.hSubMenu ? "TRUE" : "FALSE");
484 else if (mii.fType & MFT_SEPARATOR)
485 DbgPrint("%s%2d - %08x ---SEPARATOR---\n", padding, i, mii.wID);
486 else
487 DbgPrint("%s%2d - %08x: %S (state=%d, has submenu=%s)\n", padding, i, mii.wID, mii.dwTypeData, mii.fState, mii.hSubMenu ? "TRUE" : "FALSE");
488
489 if (mii.hSubMenu)
490 DbgDumpMenuInternal(mii.hSubMenu, padding, padlevel + 2);
491
492 }
493
494 padding[padlevel] = 0;
495}
496
497static __inline void DbgDumpMenu(HMENU hmenu)
498{
499 char padding[128];
500 DbgDumpMenuInternal(hmenu, padding, 0);
501}
502
503
504static inline
505void DumpIdList(LPCITEMIDLIST pcidl)
506{
507 DbgPrint("Begin IDList Dump\n");
508
509 for (; pcidl != NULL; pcidl = ILGetNext(pcidl))
510 {
511 int i;
512 int cb = pcidl->mkid.cb;
513 BYTE * sh = (BYTE*) &(pcidl->mkid);
514 if (cb == 0) // ITEMIDLISTs are terminatedwith a null SHITEMID.
515 break;
516 DbgPrint("Begin SHITEMID (cb=%d)\n", cb);
517 if ((cb & 3) != 0)
518 DbgPrint(" - WARNING: cb is not a multiple of 4\n");
519 for (i = 0; (i + 4) <= cb; i += 4)
520 {
521 DbgPrint(" - abID[%08x]: %02x %02x %02x %02x\n",
522 i,
523 sh[i + 0],
524 sh[i + 1],
525 sh[i + 2],
526 sh[i + 3]);
527 }
528 if (i < cb)
529 {
530 cb -= i;
531 if (cb == 3)
532 {
533 DbgPrint(" - abID[%08x]: %02x %02x %02x --\n",
534 i,
535 sh[i + 0],
536 sh[i + 1],
537 sh[i + 2]);
538 }
539 else if (cb == 2)
540 {
541 DbgPrint(" - abID[%08x]: %02x %02x -- --\n",
542 i,
543 sh[i + 0],
544 sh[i + 1]);
545 }
546 else if (cb == 1)
547 {
548 DbgPrint(" - abID[%08x]: %02x -- -- --\n",
549 i,
550 sh[i + 0]);
551 }
552 }
553 DbgPrint("End SHITEMID\n");
554 }
555 DbgPrint("End IDList Dump.\n");
556}
557
558struct CCoInit
559{
560 CCoInit()
561 {
563 }
564 ~CCoInit()
565 {
566 if (SUCCEEDED(hr))
567 {
569 }
570 }
571 HRESULT hr;
572};
573
574#endif /* __cplusplus */
575
576#define S_LESSTHAN 0xffff
577#define S_EQUAL S_OK
578#define S_GREATERTHAN S_FALSE
579#define MAKE_COMPARE_HRESULT(x) ((x)>0 ? S_GREATERTHAN : ((x)<0 ? S_LESSTHAN : S_EQUAL))
580
581static inline BOOL ILIsSingle(LPCITEMIDLIST pidl)
582{
583 return pidl == ILFindLastID(pidl);
584}
585
587{
588 return (PCUIDLIST_ABSOLUTE)(((LPBYTE)pida) + (pida)->aoffset[0]);
589}
590
592{
593 return (PCUIDLIST_RELATIVE)(((LPBYTE)pida) + (pida)->aoffset[i + 1]);
594}
595
596
597#ifdef __cplusplus
598
599DECLSPEC_SELECTANY CLIPFORMAT g_cfHIDA = NULL;
600DECLSPEC_SELECTANY CLIPFORMAT g_cfShellIdListOffsets = NULL;
601
602// Allow to use the HIDA from an IDataObject without copying it
603struct CDataObjectHIDA
604{
605private:
606 STGMEDIUM m_medium;
607 CIDA* m_cida;
608 HRESULT m_hr;
609
610public:
611 explicit CDataObjectHIDA(IDataObject* pDataObject)
612 : m_cida(nullptr)
613 {
614 m_medium.tymed = TYMED_NULL;
615
616 if (g_cfHIDA == NULL)
617 {
618 g_cfHIDA = (CLIPFORMAT)RegisterClipboardFormatW(CFSTR_SHELLIDLISTW);
619 }
620 FORMATETC fmt = { g_cfHIDA, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
621
622 m_hr = pDataObject->GetData(&fmt, &m_medium);
623 if (FAILED(m_hr))
624 {
625 m_medium.tymed = TYMED_NULL;
626 return;
627 }
628
629 m_cida = (CIDA*)::GlobalLock(m_medium.hGlobal);
630 if (m_cida == nullptr)
631 {
632 m_hr = E_UNEXPECTED;
633 }
634 }
635
636 ~CDataObjectHIDA()
637 {
638 if (m_cida)
639 ::GlobalUnlock(m_cida);
640
641 ReleaseStgMedium(&m_medium);
642 }
643
644 HRESULT hr() const
645 {
646 return m_hr;
647 }
648
649 operator bool() const
650 {
651 return m_cida != nullptr;
652 }
653
654 operator const CIDA* () const
655 {
656 return m_cida;
657 }
658
659 const CIDA* operator->() const
660 {
661 return m_cida;
662 }
663};
664
665inline
666HRESULT DataObject_GetData(IDataObject* pDataObject, CLIPFORMAT clipformat, PVOID pBuffer, SIZE_T dwBufferSize)
667{
668 FORMATETC fmt = { clipformat, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
669 STGMEDIUM medium = { TYMED_NULL };
670
671 HRESULT hr = pDataObject->GetData(&fmt, &medium);
672 if (SUCCEEDED(hr))
673 {
674 LPVOID blob = GlobalLock(medium.hGlobal);
675 if (blob)
676 {
677 SIZE_T size = GlobalSize(medium.hGlobal);
678 if (size <= dwBufferSize)
679 {
681 hr = S_OK;
682 }
683 else
684 {
686 }
687 GlobalUnlock(medium.hGlobal);
688 }
689 else
690 {
692 }
693
694 ReleaseStgMedium(&medium);
695 }
696 return hr;
697}
698
699inline
700HRESULT DataObject_SetData(IDataObject* pDataObject, CLIPFORMAT clipformat, PVOID pBuffer, SIZE_T dwBufferSize)
701{
702 STGMEDIUM medium = { TYMED_HGLOBAL };
703
704 medium.hGlobal = GlobalAlloc(GHND, dwBufferSize);
705 if (!medium.hGlobal)
706 return E_OUTOFMEMORY;
707
709 LPVOID blob = GlobalLock(medium.hGlobal);
710 if (blob)
711 {
712 CopyMemory(blob, pBuffer, dwBufferSize);
713 GlobalUnlock(medium.hGlobal);
714
715 FORMATETC etc = { clipformat, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
716 hr = pDataObject->SetData(&etc, &medium, TRUE);
717 }
718
719 if (FAILED(hr))
720 GlobalFree(medium.hGlobal);
721
722 return hr;
723}
724
725
726inline HRESULT
727DataObject_GetOffset(IDataObject *pDataObject, POINT *point)
728{
729 if (g_cfShellIdListOffsets == NULL)
730 {
731 g_cfShellIdListOffsets = (CLIPFORMAT)RegisterClipboardFormatW(CFSTR_SHELLIDLISTOFFSETW);
732 }
733
734 point->x = point->y = 0;
735
736 return DataObject_GetData(pDataObject, g_cfShellIdListOffsets, point, sizeof(point[0]));
737}
738
739inline HRESULT
740DataObject_SetOffset(IDataObject* pDataObject, POINT* point)
741{
742 if (g_cfShellIdListOffsets == NULL)
743 {
744 g_cfShellIdListOffsets = (CLIPFORMAT)RegisterClipboardFormatW(CFSTR_SHELLIDLISTOFFSETW);
745 }
746
747 return DataObject_SetData(pDataObject, g_cfShellIdListOffsets, point, sizeof(point[0]));
748}
749
750#endif
751
752
753#endif /* __ROS_SHELL_UTILS_H */
#define ATLASSERT(x)
Definition: CComVariant.cpp:10
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
char * va_list
Definition: acmsvcex.h:78
#define va_end(ap)
Definition: acmsvcex.h:90
#define va_start(ap, A)
Definition: acmsvcex.h:91
#define ATLTRY(x)
Definition: atlcomcli.h:44
#define STDMETHOD_(t, m)
Definition: basetyps.h:63
#define STDMETHOD(m)
Definition: basetyps.h:62
const GUID IID_IUnknown
_In_ BOOLEAN Release
Definition: cdrom.h:920
HINSTANCE hInstance
Definition: charmap.c:19
static HRESULT WINAPI CreateInstance(void *pv, REFIID riid, LPVOID *ppv)
Definition: atlcom.h:424
Definition: ehthrow.cxx:54
Definition: bufpool.h:45
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_FAIL
Definition: ddrawi.h:102
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define P(row, col)
#define MAX_PATH
Definition: compat.h:34
static HRESULT WINAPI DataObject_GetData(LPDATAOBJECT iface, LPFORMATETC pformatetcIn, STGMEDIUM *pmedium)
Definition: view.c:175
static HRESULT WINAPI DataObject_SetData(LPDATAOBJECT iface, LPFORMATETC pformatetc, STGMEDIUM *pmedium, BOOL fRelease)
Definition: view.c:203
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:1964
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:2067
void WINAPI ReleaseStgMedium(STGMEDIUM *pmedium)
Definition: ole2.c:2033
#define __FUNCTION__
Definition: types.h:116
POINTL point
Definition: edittest.c:50
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLsizeiptr size
Definition: glext.h:5919
GLuint buffer
Definition: glext.h:5915
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
Definition: glfuncs.h:248
#define DbgPrint
Definition: hal.h:12
LPVOID NTAPI GlobalLock(HGLOBAL hMem)
Definition: heapmem.c:755
HGLOBAL NTAPI GlobalFree(HGLOBAL hMem)
Definition: heapmem.c:611
BOOL NTAPI GlobalUnlock(HGLOBAL hMem)
Definition: heapmem.c:1190
HGLOBAL NTAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:368
SIZE_T NTAPI GlobalSize(HGLOBAL hMem)
Definition: heapmem.c:1090
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: ifs.c:426
void WINAPI SHIM_OBJ_NAME() OutputDebugStringA(LPCSTR lpOutputString)
Definition: ignoredbgout.c:18
int __cdecl vsprintf(char *_Dest, const char *_Format, va_list _Args)
Definition: sprintf.c:733
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
HRESULT SetData([in, unique] FORMATETC *pformatetc, [in, unique] STGMEDIUM *pmedium, [in] BOOL fRelease)
HRESULT GetData([in, unique] FORMATETC *pformatetcIn, [out] STGMEDIUM *pmedium)
ULONG AddRef()
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
ULONG Release()
#define InterlockedCompareExchangePointer
Definition: interlocked.h:129
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
const char * filename
Definition: ioapi.h:137
#define T
Definition: mbstring.h:31
#define sprintf(buf, format,...)
Definition: sprintf.c:55
static const WCHAR label[]
Definition: itemdlg.c:1546
static HMODULE MODULEINFO DWORD cb
Definition: module.c:33
static HRESULT QueryInterface(REFIID, void **)
Definition: events.c:2587
static const DWORD padding[]
Definition: mciwnd.c:89
static ULONG WINAPI AddRef(IStream *iface)
Definition: clist.c:90
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:63
_In_opt_ ULONG Base
Definition: rtlfuncs.h:2439
#define bool
Definition: nsiface.idl:72
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:237
LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl)
Definition: pidl.c:198
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:712
LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST pidl)
Definition: pidl.c:864
#define DECLSPEC_SELECTANY
Definition: guiddef.h:40
#define REFIID
Definition: guiddef.h:118
PVOID pBuffer
_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)
short sh
Definition: format.c:272
#define R(b, x)
Definition: sha2.c:134
ULONG Win32DbgPrint(const char *filename, int line, const char *lpFormat,...)
Definition: shellutils.h:27
#define DbgPrint(fmt,...)
Definition: shellutils.h:59
static PCUIDLIST_RELATIVE HIDA_GetPIDLItem(CIDA const *pida, SIZE_T i)
Definition: shellutils.h:591
HRESULT HResultFromWin32(DWORD hr)
Definition: shellutils.h:70
static PCUIDLIST_ABSOLUTE HIDA_GetPIDLFolder(CIDA const *pida)
Definition: shellutils.h:586
static BOOL ILIsSingle(LPCITEMIDLIST pidl)
Definition: shellutils.h:581
BOOL _ROS_FAILED_HELPER(HRESULT hr, const char *expr, const char *filename, int line)
Definition: shellutils.h:78
HRESULT hr
Definition: shlfolder.c:183
static const WCHAR CFSTR_SHELLIDLISTOFFSETW[]
Definition: shlobj.h:501
static const WCHAR CFSTR_SHELLIDLISTW[]
Definition: shlobj.h:499
@ STRRET_CSTR
Definition: shtypes.idl:87
@ STRRET_WSTR
Definition: shtypes.idl:85
const ITEMIDLIST_ABSOLUTE UNALIGNED * PCUIDLIST_ABSOLUTE
Definition: shtypes.idl:63
const ITEMIDLIST_RELATIVE UNALIGNED * PCUIDLIST_RELATIVE
Definition: shtypes.idl:57
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
#define _countof(array)
Definition: sndvol32.h:68
Definition: shlobj.h:565
LONG y
Definition: windef.h:330
LONG x
Definition: windef.h:329
char cStr[MAX_PATH]
Definition: shtypes.idl:98
UINT uType
Definition: shtypes.idl:93
LPWSTR pOleStr
Definition: shtypes.idl:96
Definition: image.c:134
Definition: query.h:87
Definition: dsound.c:943
Definition: parser.c:49
LPWSTR dwTypeData
Definition: winuser.h:3269
LPCWSTR lpFormat
Definition: trayclock.cpp:32
unsigned char * LPBYTE
Definition: typedefs.h:53
ULONG_PTR SIZE_T
Definition: typedefs.h:80
uint32_t ULONG
Definition: typedefs.h:59
static HMENU hmenu
Definition: win.c:66
#define CopyMemory
Definition: winbase.h:1710
#define GHND
Definition: winbase.h:297
_In_ void _In_ PCCERT_CONTEXT _In_opt_ LPFILETIME _In_ DWORD _In_ DWORD _Outptr_opt_ void ** ppvObject
Definition: wincrypt.h:6082
#define WINAPI
Definition: msvc.h:6
#define STG_E_INVALIDHANDLE
Definition: winerror.h:2569
#define CLASS_E_NOAGGREGATION
Definition: winerror.h:2662
#define E_UNEXPECTED
Definition: winerror.h:2456
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
#define E_POINTER
Definition: winerror.h:2365
#define MIIM_STRING
Definition: winuser.h:727
#define MIIM_ID
Definition: winuser.h:722
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)
#define MIIM_FTYPE
Definition: winuser.h:729
UINT WINAPI RegisterClipboardFormatW(_In_ LPCWSTR)
#define MFT_SEPARATOR
Definition: winuser.h:744
#define MIIM_STATE
Definition: winuser.h:721
#define MIIM_SUBMENU
Definition: winuser.h:723
#define MFT_BITMAP
Definition: winuser.h:738
BOOL WINAPI GetMenuItemInfoW(_In_ HMENU, _In_ UINT, _In_ BOOL, _Inout_ LPMENUITEMINFOW)
const char * LPCSTR
Definition: xmlstorage.h:183
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
unsigned char BYTE
Definition: xxhash.c:193