ReactOS 0.4.15-dev-8434-g155a7c7
travellog.cpp
Go to the documentation of this file.
1/*
2 * ReactOS Explorer
3 *
4 * Copyright 2009 Andrew Hill <ash77 at domain reactos.org>
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20
21/*
22Implements a class that keeps track of a PIDL history and allows
23navigation forward and backward. This really should be in shdocvw, but it
24is not registered for external instantiation, and the entire IBrowserService
25hierarchy that normally spans browseui and shdocvw are collapsed into one
26hierarchy in browseui, so I am moving it to browseui for now. If someone
27decides to refactor code later, it wouldn't be difficult to move it.
28
29TODO:
30****Does original travel log update the current item in the Travel method before or after calling ITravelEntry::Invoke?
31****Change to load maximum size from registry
32****Add code to track current size
33****Fix InsertMenuEntries to not exceed limit of menu item ids provided. Perhaps the method should try to be intelligent and if there are
34 too many items, center around the current item? Could cause dispatch problems...
35****Move tool tip text templates to resources
36 **Simplify code in InsertMenuEntries
37 Implement UpdateExternal
38 Implement FindTravelEntry
39 Implement Clone
40 Implement Revert
41
42*/
43
44#include "precomp.h"
45
47 public CComObjectRootEx<CComMultiThreadModelNoCS>,
48 public ITravelEntry
49{
50public:
53private:
56public:
59 HRESULT GetToolTipText(IUnknown *punk, LPWSTR pwzText) const;
60 long GetSize() const;
61
62 // *** ITravelEntry methods ***
63 STDMETHOD(Invoke)(IUnknown *punk) override;
64 STDMETHOD(Update)(IUnknown *punk, BOOL fIsLocalAnchor) override;
65 STDMETHOD(GetPidl)(LPITEMIDLIST *ppidl) override;
66
68 COM_INTERFACE_ENTRY_IID(IID_ITravelEntry, ITravelEntry)
70};
71
73 public CComObjectRootEx<CComMultiThreadModelNoCS>,
74 public ITravelLog
75{
76private:
82 unsigned long fEntryCount;
83public:
84 CTravelLog();
88 void DeleteChain(CTravelEntry *startHere);
89 void AppendEntry(CTravelEntry *afterEntry, CTravelEntry *newEntry);
90public:
91
92 // *** ITravelLog methods ***
93 STDMETHOD(AddEntry)(IUnknown *punk, BOOL fIsLocalAnchor) override;
94 STDMETHOD(UpdateEntry)(IUnknown *punk, BOOL fIsLocalAnchor) override;
95 STDMETHOD(UpdateExternal)(IUnknown *punk, IUnknown *punkHLBrowseContext) override;
96 STDMETHOD(Travel)(IUnknown *punk, int iOffset) override;
97 STDMETHOD(GetTravelEntry)(IUnknown *punk, int iOffset, ITravelEntry **ppte) override;
98 STDMETHOD(FindTravelEntry)(IUnknown *punk, LPCITEMIDLIST pidl, ITravelEntry **ppte) override;
99 STDMETHOD(GetToolTipText)(IUnknown *punk, int iOffset, int idsTemplate, LPWSTR pwzText, DWORD cchText) override;
100 STDMETHOD(InsertMenuEntries)(IUnknown *punk, HMENU hmenu, int nPos, int idFirst, int idLast, DWORD dwFlags) override;
101 STDMETHOD(Clone)(ITravelLog **pptl) override;
103 STDMETHOD(Revert)() override;
104
106 COM_INTERFACE_ENTRY_IID(IID_ITravelLog, ITravelLog)
108};
109
111{
114 fPIDL = NULL;
116}
117
119{
120 ILFree(fPIDL);
122}
123
125{
126 HRESULT hResult;
127
128 hResult = ILGetDisplayNameEx(NULL, fPIDL, pwzText, ILGDN_NORMAL) ? S_OK : E_FAIL;
129 if (FAILED_UNEXPECTEDLY(hResult))
130 return hResult;
131
132 return S_OK;
133}
134
136{
137 return 0;
138}
139
141{
142 CComPtr<IPersistHistory> persistHistory;
143 CComPtr<IStream> globalStream;
144 HRESULT hResult;
145
146 TRACE("CTravelEntry::Invoke for IUnknown punk=%p\n", punk);
147
148 hResult = punk->QueryInterface(IID_PPV_ARG(IPersistHistory, &persistHistory));
149 if (FAILED_UNEXPECTEDLY(hResult))
150 return hResult;
151 hResult = CreateStreamOnHGlobal(fPersistState, FALSE, &globalStream);
152 if (FAILED_UNEXPECTEDLY(hResult))
153 return hResult;
154 hResult = persistHistory->LoadHistory(globalStream, NULL);
155 if (FAILED_UNEXPECTEDLY(hResult))
156 return hResult;
157 return S_OK;
158}
159
161{
162 CComPtr<ITravelLogClient> travelLogClient;
163 CComPtr<IPersistHistory> persistHistory;
164 CComPtr<IStream> globalStream;
165 WINDOWDATA windowData;
166 HRESULT hResult;
167
168 TRACE("CTravelEntry::Update for IUnknown punk=%p, fIsLocalAnchor=%s\n", punk, fIsLocalAnchor ? "TRUE" : "FALSE");
169
170 if (TRACE_ON(browseui))
171 {
172 WCHAR wch[MAX_PATH * 2];
173 GetToolTipText(punk, wch);
174 TRACE("Updating entry with display name: %S\n", wch);
175 }
176
177 ZeroMemory(&windowData, sizeof(WINDOWDATA));
178 ILFree(fPIDL);
179 fPIDL = NULL;
182 hResult = punk->QueryInterface(IID_PPV_ARG(ITravelLogClient, &travelLogClient));
183 if (FAILED_UNEXPECTEDLY(hResult))
184 return hResult;
185 hResult = punk->QueryInterface(IID_PPV_ARG(IPersistHistory, &persistHistory));
186 if (FAILED_UNEXPECTEDLY(hResult))
187 return hResult;
188 hResult = CreateStreamOnHGlobal(NULL, FALSE, &globalStream);
189 if (FAILED_UNEXPECTEDLY(hResult))
190 return hResult;
191 hResult = persistHistory->SaveHistory(globalStream);
192 if (FAILED_UNEXPECTEDLY(hResult))
193 return hResult;
194 hResult = travelLogClient->GetWindowData(globalStream, &windowData);
195 if (FAILED_UNEXPECTEDLY(hResult))
196 return hResult;
197 fPIDL = windowData.pidl;
198 // TODO: Properly free the windowData
199 hResult = GetHGlobalFromStream(globalStream, &fPersistState);
200 if (FAILED_UNEXPECTEDLY(hResult))
201 return hResult;
202
203 if (TRACE_ON(browseui))
204 {
205 WCHAR wch[MAX_PATH * 2];
206 GetToolTipText(punk, wch);
207 TRACE("Updated entry display name is now: %S\n", wch);
208 }
209
210 return S_OK;
211}
212
214{
215 if (ppidl == NULL)
216 return E_POINTER;
217 *ppidl = ILClone(fPIDL);
218 if (*ppidl == NULL)
219 return E_OUTOFMEMORY;
220
221 TRACE("CTravelEntry::GetPidl returning ppidl=%p\n", *ppidl);
222
223 return S_OK;
224}
225
227{
228 fListHead = NULL;
229 fListTail = NULL;
231 fMaximumSize = 0;
232 fCurrentSize = 0;
233 fEntryCount = 0;
234 TRACE("CTravelLog created\n");
235}
236
238{
239 CTravelEntry *anEntry;
241
242 anEntry = fListHead;
243 while (anEntry != NULL)
244 {
245 next = anEntry->fNextEntry;
246 anEntry->Release();
247 anEntry = next;
248 }
249 TRACE("CTravelLog destroyed\n");
250}
251
253{
254 fMaximumSize = 1024 * 1024; // TODO: change to read this from registry
255 // Software\Microsoft\Windows\CurrentVersion\Explorer\TravelLog
256 // MaxSize
257 return S_OK;
258}
259
261{
262 CTravelEntry *curEntry;
263 int offset = _offset;
264
265 if (foundEntry == NULL)
266 return E_INVALIDARG;
267
268 *foundEntry = NULL;
269 curEntry = fCurrentEntry;
270 if (offset < 0)
271 {
272 while (offset < 0 && curEntry != NULL)
273 {
274 curEntry = curEntry->fPreviousEntry;
275 offset++;
276 }
277 }
278 else
279 {
280 while (offset > 0 && curEntry != NULL)
281 {
282 curEntry = curEntry->fNextEntry;
283 offset--;
284 }
285 }
286 if (curEntry == NULL)
287 return E_INVALIDARG;
288
289 *foundEntry = curEntry;
290
291 TRACE("CTravelLog::FindRelativeEntry for offset %d, returning %p\n", offset, *foundEntry);
292
293 return S_OK;
294}
295
297{
298 CTravelEntry *saveNext;
299 long itemSize;
300
301 TRACE("CTravelLog::DeleteChain deleting chain starting at %p\n", startHere);
302
303 long startEntryCount = fEntryCount;
304
305 if (startHere->fPreviousEntry != NULL)
306 {
307 startHere->fPreviousEntry->fNextEntry = NULL;
308 fListTail = startHere->fPreviousEntry;
309 }
310 else
311 {
312 fListHead = NULL;
313 fListTail = NULL;
314 }
315 while (startHere != NULL)
316 {
317 saveNext = startHere->fNextEntry;
318 itemSize = startHere->GetSize();
319 fCurrentSize -= itemSize;
320 startHere->Release();
321 startHere = saveNext;
322 fEntryCount--;
323 }
324
325 TRACE("CTravelLog::DeleteChain chain of %d items deleted\n", startEntryCount - fEntryCount);
326}
327
329{
330 if (afterEntry == NULL)
331 {
332 TRACE("CTravelLog::AppendEntry appending %p after NULL. Resetting head and tail\n", newEntry);
333 fListHead = newEntry;
334 fListTail = newEntry;
335 }
336 else
337 {
338 TRACE("CTravelLog::AppendEntry appending %p after %p\n", newEntry, afterEntry);
339 newEntry->fNextEntry = afterEntry->fNextEntry;
340 afterEntry->fNextEntry = newEntry;
341 newEntry->fPreviousEntry = afterEntry;
342 if (newEntry->fNextEntry == NULL)
343 fListTail = newEntry;
344 else
345 newEntry->fNextEntry->fPreviousEntry = newEntry;
346 }
347 fEntryCount++;
348}
349
351{
352 CComObject<CTravelEntry> *newEntry;
353 long itemSize;
354
355 TRACE("CTravelLog::AddEntry for IUnknown punk=%p, fIsLocalAnchor=%s\n", punk, fIsLocalAnchor ? "TRUE" : "FALSE");
356
357 if (punk == NULL)
358 return E_INVALIDARG;
359 ATLTRY (newEntry = new CComObject<CTravelEntry>);
360 if (newEntry == NULL)
361 return E_OUTOFMEMORY;
362 newEntry->AddRef();
365 AppendEntry(fCurrentEntry, newEntry);
366 itemSize = newEntry->GetSize();
367 fCurrentSize += itemSize;
368 fCurrentEntry = newEntry;
369 return S_OK;
370}
371
373{
374 if (punk == NULL)
375 return E_INVALIDARG;
376 if (fCurrentEntry == NULL)
377 return E_UNEXPECTED;
378 return fCurrentEntry->Update(punk, fIsLocalAnchor);
379}
380
382{
383 return E_NOTIMPL;
384}
385
387{
388 CTravelEntry *destinationEntry;
389 HRESULT hResult;
390
391 TRACE("CTravelLog::Travel for IUnknown punk=%p at offset=%d\n", punk, iOffset);
392
393 hResult = FindRelativeEntry(iOffset, &destinationEntry);
394 if (FAILED_UNEXPECTEDLY(hResult))
395 return hResult;
396 fCurrentEntry = destinationEntry;
397 hResult = destinationEntry->Invoke(punk);
398 if (FAILED_UNEXPECTEDLY(hResult))
399 return hResult;
400 return S_OK;
401}
402
404{
405 CTravelEntry *destinationEntry;
406 HRESULT hResult;
407
408 hResult = FindRelativeEntry(iOffset, &destinationEntry);
409 if (FAILED(hResult))
410 return hResult;
411 hResult = destinationEntry->QueryInterface(IID_PPV_ARG(ITravelEntry, ppte));
412 if (FAILED_UNEXPECTEDLY(hResult))
413 return hResult;
414
415 TRACE("CTravelLog::GetTravelEntry for IUnknown punk=%p at offset=%d returning %p\n", punk, iOffset, *ppte);
416
417 return hResult;
418}
419
421{
422 if (ppte == NULL)
423 return E_POINTER;
424 if (punk == NULL || pidl == NULL)
425 return E_INVALIDARG;
426
428
429 return E_NOTIMPL;
430}
431
433{
434 CTravelEntry *destinationEntry;
435 wchar_t tempString[MAX_PATH];
436 wchar_t templateString[200];
437 HRESULT hResult;
438
439 if (pwzText == NULL)
440 return E_POINTER;
441 if (punk == NULL || cchText == 0)
442 return E_INVALIDARG;
443 hResult = FindRelativeEntry(iOffset, &destinationEntry);
444 if (FAILED_UNEXPECTEDLY(hResult))
445 return hResult;
446 hResult = destinationEntry->GetToolTipText(punk, tempString);
447 if (FAILED_UNEXPECTEDLY(hResult))
448 return hResult;
449 if (iOffset < 0)
450 {
451 if(LoadStringW(_AtlBaseModule.GetResourceInstance(),
452 IDS_BACK, templateString, sizeof(templateString) / sizeof(wchar_t)) == 0)
454 }
455 else
456 {
457 if(LoadStringW(_AtlBaseModule.GetResourceInstance(),
458 IDS_FORWARD, templateString, sizeof(templateString) / sizeof(wchar_t)) == 0)
460 }
461 _snwprintf(pwzText, cchText, templateString, tempString);
462
463 TRACE("CTravelLog::GetToolTipText for IUnknown punk=%p at offset=%d returning L\"%S\"\n", punk, iOffset, pwzText);
464
465 return S_OK;
466}
467
468static void FixAmpersands(wchar_t *buffer)
469{
470 wchar_t tempBuffer[MAX_PATH * 2];
471 wchar_t ch;
472 wchar_t *srcPtr;
473 wchar_t *dstPtr;
474
475 srcPtr = buffer;
476 dstPtr = tempBuffer;
477 while (*srcPtr != 0)
478 {
479 ch = *srcPtr++;
480 *dstPtr++ = ch;
481 if (ch == '&')
482 *dstPtr++ = '&';
483 }
484 *dstPtr = 0;
485 wcscpy(buffer, tempBuffer);
486}
487
489 int nPos, int idFirst, int idLast, DWORD dwFlags)
490{
491 CTravelEntry *currentItem;
492 MENUITEMINFO menuItemInfo;
493 wchar_t itemTextBuffer[MAX_PATH * 2];
494 HRESULT hResult;
495
496 TRACE("CTravelLog::InsertMenuEntries for IUnknown punk=%p, nPos=%d, idFirst=%d, idLast=%d\n", punk);
497
498 // TLMENUF_BACK - include back entries
499 // TLMENUF_INCLUDECURRENT - include current entry, if TLMENUF_CHECKCURRENT then check the entry
500 // TLMENUF_FORE - include next entries
501 // if fore+back, list from oldest to newest
502 // if back, list from newest to oldest
503 // if fore, list from newest to oldest
504
505 // don't forget to patch ampersands before adding to menu
506 if (punk == NULL)
507 return E_INVALIDARG;
508 if (idLast <= idFirst)
509 return E_INVALIDARG;
510 menuItemInfo.cbSize = sizeof(menuItemInfo);
511 menuItemInfo.fMask = MIIM_FTYPE | MIIM_ID | MIIM_STATE | MIIM_STRING;
512 menuItemInfo.fType = MFT_STRING;
513 menuItemInfo.wID = idFirst;
514 menuItemInfo.fState = MFS_ENABLED;
515 menuItemInfo.dwTypeData = itemTextBuffer;
516 if ((dwFlags & TLMENUF_BACK) != 0)
517 {
518 if ((dwFlags & TLMENUF_FORE) != 0)
519 {
520 currentItem = fCurrentEntry;
521 if (currentItem != NULL)
522 {
523 while (currentItem->fPreviousEntry != NULL)
524 currentItem = currentItem->fPreviousEntry;
525 }
526 while (currentItem != fCurrentEntry)
527 {
528 hResult = currentItem->GetToolTipText(punk, itemTextBuffer);
529 if (SUCCEEDED(hResult))
530 {
531 FixAmpersands(itemTextBuffer);
532 TRACE("CTravelLog::InsertMenuEntries adding entry L\"%S\"/L\"%S\" with id %d\n", itemTextBuffer, menuItemInfo.dwTypeData, menuItemInfo.wID);
533 if (InsertMenuItem(hmenu, nPos, TRUE, &menuItemInfo))
534 {
535 nPos++;
536 menuItemInfo.wID++;
537 }
538 }
539 currentItem = currentItem->fNextEntry;
540 }
541 }
542 else
543 {
544 currentItem = fCurrentEntry;
545 if (currentItem != NULL)
546 currentItem = currentItem->fPreviousEntry;
547 while (currentItem != NULL)
548 {
549 hResult = currentItem->GetToolTipText(punk, itemTextBuffer);
550 if (SUCCEEDED(hResult))
551 {
552 FixAmpersands(itemTextBuffer);
553 TRACE("CTravelLog::InsertMenuEntries adding entry L\"%S\"/L\"%S\" with id %d\n", itemTextBuffer, menuItemInfo.dwTypeData, menuItemInfo.wID);
554 if (InsertMenuItem(hmenu, nPos, TRUE, &menuItemInfo))
555 {
556 nPos++;
557 menuItemInfo.wID++;
558 }
559 }
560 currentItem = currentItem->fPreviousEntry;
561 }
562 }
563 }
564 if ((dwFlags & TLMENUF_INCLUDECURRENT) != 0)
565 {
566 if (fCurrentEntry != NULL)
567 {
568 hResult = fCurrentEntry->GetToolTipText(punk, itemTextBuffer);
569 if (SUCCEEDED(hResult))
570 {
571 FixAmpersands(itemTextBuffer);
572 if ((dwFlags & TLMENUF_CHECKCURRENT) != 0)
573 menuItemInfo.fState |= MFS_CHECKED;
574 TRACE("CTravelLog::InsertMenuEntries adding entry L\"%S\"/L\"%S\" with id %d\n", itemTextBuffer, menuItemInfo.dwTypeData, menuItemInfo.wID);
575 if (InsertMenuItem(hmenu, nPos, TRUE, &menuItemInfo))
576 {
577 nPos++;
578 menuItemInfo.wID++;
579 }
580 menuItemInfo.fState &= ~MFS_CHECKED;
581 }
582 }
583 }
584 if ((dwFlags & TLMENUF_FORE) != 0)
585 {
586 currentItem = fCurrentEntry;
587 if (currentItem != NULL)
588 currentItem = currentItem->fNextEntry;
589 while (currentItem != NULL)
590 {
591 hResult = currentItem->GetToolTipText(punk, itemTextBuffer);
592 if (SUCCEEDED(hResult))
593 {
594 FixAmpersands(itemTextBuffer);
595 TRACE("CTravelLog::InsertMenuEntries adding entry L\"%S\"/L\"%S\" with id %d\n", itemTextBuffer, menuItemInfo.dwTypeData, menuItemInfo.wID);
596 if (InsertMenuItem(hmenu, nPos, TRUE, &menuItemInfo))
597 {
598 nPos++;
599 menuItemInfo.wID++;
600 }
601 }
602 currentItem = currentItem->fNextEntry;
603 }
604 }
605 return S_OK;
606}
607
609{
610 if (pptl == NULL)
611 return E_POINTER;
612 *pptl = NULL;
613 // duplicate the log
615 return E_NOTIMPL;
616}
617
619{
620 if (punk == NULL)
621 return E_INVALIDARG;
622 return fEntryCount;
623}
624
626{
627 // remove the current entry?
629 return E_NOTIMPL;
630}
631
633{
634 return ShellObjectCreatorInit<CTravelLog>(riid, ppv);
635}
#define ATLTRY(x)
Definition: atlcomcli.h:44
@ Update
Definition: registry.c:565
#define STDMETHOD(m)
Definition: basetyps.h:62
#define STDMETHODCALLTYPE
Definition: bdasup.h:9
#define UNIMPLEMENTED
Definition: debug.h:118
LPITEMIDLIST fPIDL
Definition: travellog.cpp:54
long GetSize() const
Definition: travellog.cpp:135
STDMETHOD() Update(IUnknown *punk, BOOL fIsLocalAnchor) override
Definition: travellog.cpp:160
HRESULT GetToolTipText(IUnknown *punk, LPWSTR pwzText) const
Definition: travellog.cpp:124
CTravelEntry * fNextEntry
Definition: travellog.cpp:51
STDMETHOD() GetPidl(LPITEMIDLIST *ppidl) override
Definition: travellog.cpp:213
STDMETHOD() Invoke(IUnknown *punk) override
Definition: travellog.cpp:140
CTravelEntry * fPreviousEntry
Definition: travellog.cpp:52
HGLOBAL fPersistState
Definition: travellog.cpp:55
STDMETHOD() Revert() override
Definition: travellog.cpp:625
CTravelEntry * fListHead
Definition: travellog.cpp:77
STDMETHOD_(DWORD, CountEntries)(IUnknown *punk) override
STDMETHOD() FindTravelEntry(IUnknown *punk, LPCITEMIDLIST pidl, ITravelEntry **ppte) override
Definition: travellog.cpp:420
long fMaximumSize
Definition: travellog.cpp:80
STDMETHOD() UpdateEntry(IUnknown *punk, BOOL fIsLocalAnchor) override
Definition: travellog.cpp:372
HRESULT Initialize()
Definition: travellog.cpp:252
STDMETHOD() GetTravelEntry(IUnknown *punk, int iOffset, ITravelEntry **ppte) override
Definition: travellog.cpp:403
STDMETHOD() Clone(ITravelLog **pptl) override
Definition: travellog.cpp:608
STDMETHOD() UpdateExternal(IUnknown *punk, IUnknown *punkHLBrowseContext) override
Definition: travellog.cpp:381
void AppendEntry(CTravelEntry *afterEntry, CTravelEntry *newEntry)
Definition: travellog.cpp:328
long fCurrentSize
Definition: travellog.cpp:81
STDMETHOD() InsertMenuEntries(IUnknown *punk, HMENU hmenu, int nPos, int idFirst, int idLast, DWORD dwFlags) override
Definition: travellog.cpp:488
CTravelEntry * fCurrentEntry
Definition: travellog.cpp:79
STDMETHOD() AddEntry(IUnknown *punk, BOOL fIsLocalAnchor) override
Definition: travellog.cpp:350
void DeleteChain(CTravelEntry *startHere)
Definition: travellog.cpp:296
CTravelEntry * fListTail
Definition: travellog.cpp:78
STDMETHOD() Travel(IUnknown *punk, int iOffset) override
Definition: travellog.cpp:386
unsigned long fEntryCount
Definition: travellog.cpp:82
STDMETHOD() GetToolTipText(IUnknown *punk, int iOffset, int idsTemplate, LPWSTR pwzText, DWORD cchText) override
Definition: travellog.cpp:432
HRESULT FindRelativeEntry(int offset, CTravelEntry **foundEntry)
Definition: travellog.cpp:260
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#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 IDS_FORWARD
Definition: resource.h:133
#define IDS_BACK
Definition: resource.h:132
#define TRACE_ON(x)
Definition: compat.h:75
#define MAX_PATH
Definition: compat.h:34
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:121
HRESULT WINAPI GetHGlobalFromStream(IStream *pstm, HGLOBAL *phglobal)
HRESULT WINAPI CreateStreamOnHGlobal(HGLOBAL hGlobal, BOOL fDeleteOnRelease, LPSTREAM *ppstm)
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint buffer
Definition: glext.h:5915
GLintptr offset
Definition: glext.h:5920
HGLOBAL NTAPI GlobalFree(HGLOBAL hMem)
Definition: heapmem.c:611
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
DWORD CountEntries([in] IUnknown *punk)
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
ULONG Release()
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define BEGIN_COM_MAP(x)
Definition: atlcom.h:581
#define COM_INTERFACE_ENTRY_IID(iid, x)
Definition: atlcom.h:601
#define END_COM_MAP()
Definition: atlcom.h:592
int _snwprintf(wchar_t *buffer, size_t count, const wchar_t *format,...)
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:63
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:237
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:940
BOOL WINAPI ILGetDisplayNameEx(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPVOID path, DWORD type)
Definition: pidl.c:171
#define REFIID
Definition: guiddef.h:118
static unsigned __int64 next
Definition: rand_nt.c:6
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
#define TLMENUF_CHECKCURRENT
Definition: shlobj.h:2740
#define TLMENUF_BACK
Definition: shlobj.h:2741
#define TLMENUF_FORE
Definition: shlobj.h:2742
#define TLMENUF_INCLUDECURRENT
Definition: shlobj.h:2739
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
#define TRACE(s)
Definition: solgame.cpp:4
PIDLIST_ABSOLUTE pidl
Definition: tlogstg.idl:26
LPSTR dwTypeData
Definition: winuser.h:3251
HRESULT CTravelLog_CreateInstance(REFIID riid, void **ppv)
Definition: travellog.cpp:632
static void FixAmpersands(wchar_t *buffer)
Definition: travellog.cpp:468
#define ILGDN_NORMAL
Definition: undocshell.h:72
static HMENU hmenu
Definition: win.c:66
#define ZeroMemory
Definition: winbase.h:1712
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
_In_ POINTL * pptl
Definition: winddi.h:3741
#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 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
#define InsertMenuItem
Definition: winuser.h:5813
#define MIIM_STATE
Definition: winuser.h:721
_In_ int cchText
Definition: winuser.h:4465
#define MFS_CHECKED
Definition: winuser.h:747
#define MFS_ENABLED
Definition: winuser.h:750
#define MFT_STRING
Definition: winuser.h:746
#define IID_PPV_ARG(Itype, ppType)
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184