ReactOS 0.4.15-dev-5669-g09dde2c
CNewMenu.cpp
Go to the documentation of this file.
1/*
2 * provides new shell item service
3 *
4 * Copyright 2007 Johannes Anderwald (johannes.anderwald@reactos.org)
5 * Copyright 2009 Andrew Hill
6 * Copyright 2012 Rafal Harabien
7 * Copyright 2019 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
8 *
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
13 *
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 */
23
24#include "precomp.h"
25
27
29 m_pidlFolder(NULL),
30 m_pItems(NULL),
31 m_pLinkItem(NULL),
32 m_pSite(NULL),
33 m_idCmdFirst(0),
34 m_idCmdFolder(-1),
35 m_idCmdLink(-1),
36 m_hIconFolder(NULL),
37 m_hIconLink(NULL)
38{
39}
40
42{
44
45 if (m_pidlFolder)
47}
48
50{
51 /* Note: free allows NULL as argument */
52 free(pItem->pData);
53 free(pItem->pwszDesc);
54 free(pItem->pwszExt);
55
56 if (pItem->hIcon)
57 DestroyIcon(pItem->hIcon);
58
59 HeapFree(GetProcessHeap(), 0, pItem);
60}
61
63{
64 SHELLNEW_ITEM *pCurItem;
65
66 /* Unload the handler items, including the link item */
67 while (m_pItems)
68 {
69 pCurItem = m_pItems;
71 UnloadItem(pCurItem);
72 }
73 m_pItems = NULL;
75}
76
78{
79 HKEY hKey;
80 WCHAR wszBuf[MAX_PATH];
82 DWORD cbData;
83
84 StringCbPrintfW(wszBuf, sizeof(wszBuf), L"%s\\ShellNew", pwszExt);
85
86 TRACE("LoadItem Keyname %s Name %s\n", debugstr_w(pwszExt), debugstr_w(wszBuf));
87
89 {
90 TRACE("Failed to open key\n");
91 return NULL;
92 }
93
94 /* Find first valid value */
95 struct
96 {
97 LPCWSTR pszName;
99 BOOL bNeedData;
100 BOOL bStr;
101 } Types[] = {
102 {L"FileName", SHELLNEW_TYPE_FILENAME, TRUE, TRUE},
103 {L"Command", SHELLNEW_TYPE_COMMAND, TRUE, TRUE},
104 {L"Data", SHELLNEW_TYPE_DATA, TRUE, FALSE},
105 {L"NullFile", SHELLNEW_TYPE_NULLFILE, FALSE},
106 {NULL}
107 };
108 UINT i;
109
110 for (i = 0; Types[i].pszName; ++i)
111 {
112 /* Note: We are using ANSI function because strings can be treated as data */
113 cbData = 0;
115 DWORD dwType;
116 if (RegGetValueW(hKey, NULL, Types[i].pszName, dwFlags, NULL, NULL, &cbData) == ERROR_SUCCESS)
117 {
118 if (Types[i].bNeedData && cbData > 0)
119 {
120 pData = (PBYTE)malloc(cbData);
121 RegGetValueW(hKey, NULL, Types[i].pszName, dwFlags, &dwType, pData, &cbData);
122 if (!Types[i].bStr && (dwType == REG_SZ || dwType == REG_EXPAND_SZ))
123 {
124 PBYTE pData2 = (PBYTE)malloc(cbData);
125 cbData = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)pData, -1, (LPSTR)pData2, cbData, NULL, NULL);
126 free(pData);
127 pData = pData2;
128 }
129 }
130 break;
131 }
132 }
134
135 /* Was any key found? */
136 if (!Types[i].pszName)
137 {
138 free(pData);
139 return NULL;
140 }
141
142 SHFILEINFOW fi;
144 {
145 free(pData);
146 return NULL;
147 }
148
149 /* Create new item */
150 SHELLNEW_ITEM *pNewItem = static_cast<SHELLNEW_ITEM *>(HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(SHELLNEW_ITEM)));
151 if (!pNewItem)
152 {
153 free(pData);
154 return NULL;
155 }
156
157 TRACE("new item %ls\n", fi.szTypeName);
158 pNewItem->Type = Types[i].Type;
159 pNewItem->pData = pData;
160 pNewItem->cbData = pData ? cbData : 0;
161 pNewItem->pwszExt = _wcsdup(pwszExt);
162 pNewItem->pwszDesc = _wcsdup(fi.szTypeName);
163 if (fi.hIcon)
164 pNewItem->hIcon = fi.hIcon;
165
166 return pNewItem;
167}
168
169BOOL
171{
172 HKEY hKey;
173 DWORD dwSize = 0;
174 DWORD dwIndex = 0;
175 LPWSTR lpValue;
176 LPWSTR lpValues;
177 WCHAR wszName[MAX_PATH];
178 SHELLNEW_ITEM *pNewItem;
179 SHELLNEW_ITEM *pCurItem = NULL;
180
181 /* Enumerate all extensions */
182 while (RegEnumKeyW(HKEY_CLASSES_ROOT, dwIndex++, wszName, _countof(wszName)) == ERROR_SUCCESS)
183 {
184 if (wszName[0] != L'.')
185 continue;
186
187 pNewItem = LoadItem(wszName);
188 if (pNewItem)
189 {
190 dwSize += wcslen(wszName) + 1;
191 if (!m_pLinkItem && wcsicmp(pNewItem->pwszExt, L".lnk") == 0)
192 {
193 /* The unique link handler */
194 m_pLinkItem = pNewItem;
195 }
196
197 /* Add at the end of the list */
198 if (pCurItem)
199 {
200 pCurItem->pNext = pNewItem;
201 pCurItem = pNewItem;
202 }
203 else
204 {
205 pCurItem = m_pItems = pNewItem;
206 }
207 }
208 }
209
210 dwSize++;
211
212 lpValues = (LPWSTR) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSize * sizeof(WCHAR));
213 if (!lpValues)
214 return FALSE;
215
216 for (pCurItem = m_pItems, lpValue = lpValues; pCurItem; pCurItem = pCurItem->pNext)
217 {
218 memcpy(lpValue, pCurItem->pwszExt, (wcslen(pCurItem->pwszExt) + 1) * sizeof(WCHAR));
219 lpValue += wcslen(pCurItem->pwszExt) + 1;
220 }
221
223 {
224 HeapFree(GetProcessHeap(), 0, lpValues);
225 return FALSE;
226 }
227
228 if (RegSetValueExW(hKey, L"Classes", NULL, REG_MULTI_SZ, (LPBYTE)lpValues, dwSize * sizeof(WCHAR)) != ERROR_SUCCESS)
229 {
230 HeapFree(GetProcessHeap(), 0, lpValues);
232 return FALSE;
233 }
234
235 HeapFree(GetProcessHeap(), 0, lpValues);
237
238 return TRUE;
239}
240
241BOOL
243{
244 LPWSTR wszName;
245 LPWSTR lpValues;
247 HKEY hKey;
248 SHELLNEW_ITEM *pNewItem;
249 SHELLNEW_ITEM *pCurItem = NULL;
250
252 return FALSE;
253
254 if (RegQueryValueExW(hKey, L"Classes", NULL, NULL, NULL, &dwSize) != ERROR_SUCCESS)
255 return FALSE;
256
257 lpValues = (LPWSTR) HeapAlloc(GetProcessHeap(), 0, dwSize);
258 if (!lpValues)
259 return FALSE;
260
261 if (RegQueryValueExW(hKey, L"Classes", NULL, NULL, (LPBYTE)lpValues, &dwSize) != ERROR_SUCCESS)
262 {
263 HeapFree(GetProcessHeap(), 0, lpValues);
264 return FALSE;
265 }
266
267 wszName = lpValues;
268
269 for (; *wszName != '\0'; wszName += wcslen(wszName) + 1)
270 {
271 pNewItem = LoadItem(wszName);
272 if (pNewItem)
273 {
274 if (!m_pLinkItem && wcsicmp(pNewItem->pwszExt, L".lnk") == 0)
275 {
276 /* The unique link handler */
277 m_pLinkItem = pNewItem;
278 }
279
280 /* Add at the end of the list */
281 if (pCurItem)
282 {
283 pCurItem->pNext = pNewItem;
284 pCurItem = pNewItem;
285 }
286 else
287 {
288 pCurItem = m_pItems = pNewItem;
289 }
290 }
291 }
292
293 HeapFree(GetProcessHeap(), 0, lpValues);
295
296 return TRUE;
297}
298
299BOOL
301{
302 // TODO: We need to find a way to refresh the cache from time to time, when
303 // e.g. new extensions with ShellNew handlers have been added or removed.
304
305 /* If there are any unload them */
307
308 if (!LoadCachedItems())
309 {
310 CacheItems();
311 }
312
313 return (m_pItems != NULL);
314}
315
316UINT
318{
319 MENUITEMINFOW mii;
320 UINT idCmd = idCmdFirst;
321 WCHAR wszBuf[256];
322
323 if (m_pItems == NULL)
324 {
325 if (!LoadAllItems())
326 return 0;
327 }
328
329 ZeroMemory(&mii, sizeof(mii));
330 mii.cbSize = sizeof(mii);
331
332 m_idCmdFirst = idCmd;
333
334 /* Insert the new folder action */
336 wszBuf[0] = 0;
338 mii.dwTypeData = wszBuf;
339 mii.cch = wcslen(mii.dwTypeData);
340 mii.wID = idCmd;
341 mii.hbmpItem = HBMMENU_CALLBACK;
342 if (InsertMenuItemW(hMenu, Pos++, TRUE, &mii))
343 m_idCmdFolder = idCmd++;
344
345 /* Insert the new shortcut action */
346 if (m_pLinkItem)
347 {
349 wszBuf[0] = 0;
350 mii.dwTypeData = wszBuf;
351 mii.cch = wcslen(mii.dwTypeData);
352 mii.wID = idCmd;
353 if (InsertMenuItemW(hMenu, Pos++, TRUE, &mii))
354 m_idCmdLink = idCmd++;
355 }
356
357 /* Insert a seperator for the custom new action */
358 mii.fMask = MIIM_TYPE | MIIM_ID;
359 mii.fType = MFT_SEPARATOR;
360 mii.wID = -1;
361 InsertMenuItemW(hMenu, Pos++, TRUE, &mii);
362
363 /* Insert the rest of the items */
365 mii.fType = 0;
366
367 for (SHELLNEW_ITEM *pCurItem = m_pItems; pCurItem; pCurItem = pCurItem->pNext)
368 {
369 /* Skip shortcut item */
370 if (pCurItem == m_pLinkItem)
371 continue;
372
373 TRACE("szDesc %s\n", debugstr_w(pCurItem->pwszDesc));
374 mii.dwItemData = (ULONG_PTR)pCurItem;
375 mii.dwTypeData = pCurItem->pwszDesc;
376 mii.cch = wcslen(mii.dwTypeData);
377 mii.wID = idCmd;
378 if (InsertMenuItemW(hMenu, Pos++, TRUE, &mii))
379 ++idCmd;
380 }
381
382 return idCmd - idCmdFirst;
383}
384
386{
387 /* Folder */
388 if (m_idCmdFirst + IdOffset == m_idCmdFolder)
389 return NULL;
390
391 /* Shortcut */
392 if (m_idCmdFirst + IdOffset == m_idCmdLink)
393 return m_pLinkItem;
394
395 /* Find shell new item - Retrieve menu item info */
396 MENUITEMINFOW mii;
397 ZeroMemory(&mii, sizeof(mii));
398 mii.cbSize = sizeof(mii);
399 mii.fMask = MIIM_DATA;
400
401 if (GetMenuItemInfoW(m_hSubMenu, m_idCmdFirst + IdOffset, FALSE, &mii) && mii.dwItemData)
402 return (SHELLNEW_ITEM *)mii.dwItemData;
403 else
404 return NULL;
405}
406
408{
411 HRESULT hr = E_FAIL;
412 LPITEMIDLIST pidl;
413 PITEMID_CHILD pidlNewItem;
414 DWORD dwSelectFlags;
415
416 dwSelectFlags = SVSI_DESELECTOTHERS | SVSI_ENSUREVISIBLE | SVSI_FOCUSED | SVSI_SELECT;
417 if (bRename)
418 dwSelectFlags |= SVSI_EDIT;
419
420 /* Notify the view object about the new item */
421 SHChangeNotify(wEventId, uFlags, (LPCVOID) pszName, NULL);
422
423 if (!m_pSite)
424 return S_OK;
425
426 /* Get a pointer to the shell view */
429 return S_OK;
430
431 /* Attempt to get the pidl of the new item */
432 hr = SHILCreateFromPathW(pszName, &pidl, NULL);
434 return hr;
435
436 pidlNewItem = ILFindLastID(pidl);
437
438 hr = lpSV->SelectItem(pidlNewItem, dwSelectFlags);
439
440 SHFree(pidl);
441
442 return hr;
443}
444
445// Code is duplicated in CDefaultContextMenu
447{
448 WCHAR wszPath[MAX_PATH];
449 WCHAR wszName[MAX_PATH];
450 WCHAR wszNewFolder[25];
451 HRESULT hr;
452
453 /* Get folder path */
456 return hr;
457
458 if (!LoadStringW(shell32_hInstance, IDS_NEWFOLDER, wszNewFolder, _countof(wszNewFolder)))
459 return E_FAIL;
460
461 /* Create the name of the new directory */
462 if (!PathYetAnotherMakeUniqueName(wszName, wszPath, NULL, wszNewFolder))
463 return E_FAIL;
464
465 /* Create the new directory and show the appropriate dialog in case of error */
466 if (SHCreateDirectory(lpici->hwnd, wszName) != ERROR_SUCCESS)
467 return E_FAIL;
468
469 /* Show and select the new item in the def view */
471
472 return S_OK;
473}
474
476{
477 WCHAR wszBuf[MAX_PATH];
478 LPWSTR Ptr, pwszCmd;
479 WCHAR wszTemp[MAX_PATH];
480 STARTUPINFOW si;
482
483 if (!ExpandEnvironmentStringsW((LPWSTR)pItem->pData, wszBuf, _countof(wszBuf)))
484 {
485 TRACE("ExpandEnvironmentStrings failed\n");
486 return E_FAIL;
487 }
488
489 /* Expand command parameter, FIXME: there can be more modifiers */
490 Ptr = wcsstr(wszBuf, L"%1");
491 if (Ptr)
492 {
493 Ptr[1] = L's';
494 StringCbPrintfW(wszTemp, sizeof(wszTemp), wszBuf, wszPath);
495 pwszCmd = wszTemp;
496 }
497 else
498 {
499 pwszCmd = wszBuf;
500 }
501
502 /* Create process */
503 ZeroMemory(&si, sizeof(si));
504 si.cb = sizeof(si);
505 if (CreateProcessW(NULL, pwszCmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
506 {
507 CloseHandle(pi.hProcess);
508 CloseHandle(pi.hThread);
509 return S_OK;
510 }
511 else
512 {
513 ERR("Failed to create process\n");
514 return E_FAIL;
515 }
516}
517
519 DWORD cchNameMax, LPCWSTR wszPath)
520{
521 WCHAR wszBuf[MAX_PATH];
522 WCHAR wszNewFile[MAX_PATH];
524
526 return E_FAIL;
527
528 StringCchPrintfW(wszNewFile, _countof(wszNewFile), L"%s %s%s", wszBuf, pItem->pwszDesc, pItem->pwszExt);
529
530 /* Create the name of the new file */
531 if (!PathYetAnotherMakeUniqueName(wszName, wszPath, NULL, wszNewFile))
532 return E_FAIL;
533
534 /* Create new file */
537 {
538 if (pItem->Type == SHELLNEW_TYPE_DATA)
539 {
540 /* Write a content */
541 DWORD cbWritten;
542 WriteFile(hFile, pItem->pData, pItem->cbData, &cbWritten, NULL);
543 }
544
545 /* Close file now */
547 }
548 else
549 {
550 bSuccess = FALSE;
551 }
552
553 if (pItem->Type == SHELLNEW_TYPE_FILENAME)
554 {
555 /* Copy file */
556 if (!CopyFileW((LPWSTR)pItem->pData, wszName, FALSE))
557 ERR("Copy file failed: %ls\n", (LPWSTR)pItem->pData);
558 }
559
560 /* Show message if we failed */
561 if (bSuccess)
562 {
563 TRACE("Notifying fs %s\n", debugstr_w(wszName));
565 }
566 else
567 {
568 StringCbPrintfW(wszBuf, sizeof(wszBuf), L"Cannot create file: %s", wszName);
569 MessageBoxW(NULL, wszBuf, L"Cannot create file", MB_OK | MB_ICONERROR); // FIXME load localized error msg
570 }
571
572 return S_OK;
573}
574
576{
577 HRESULT hr;
578 WCHAR wszPath[MAX_PATH], wszName[MAX_PATH];
579
580 /* Get folder path */
583 return hr;
584
585 if (pItem == m_pLinkItem)
586 {
587 NewItemByNonCommand(pItem, wszName, _countof(wszName), wszPath);
588 NewItemByCommand(pItem, wszName);
589 return S_OK;
590 }
591
592 switch (pItem->Type)
593 {
595 NewItemByCommand(pItem, wszPath);
596 break;
597
601 NewItemByNonCommand(pItem, wszName, _countof(wszName), wszPath);
602 break;
603
605 ERR("Invalid type\n");
606 break;
607 }
608
609 return S_OK;
610}
611
613{
614 m_pSite = pUnkSite;
615 return S_OK;
616}
617
619{
620 return m_pSite->QueryInterface(riid, ppvSite);
621}
622
624WINAPI
626 UINT indexMenu,
627 UINT idCmdFirst,
628 UINT idCmdLast,
629 UINT uFlags)
630{
631 MENUITEMINFOW mii;
632 UINT cItems = 0;
633 WCHAR wszNew[200];
634
635 TRACE("%p %p %u %u %u %u\n", this,
636 hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
637
639 return E_FAIL;
640
642 if (!m_hSubMenu)
643 return E_FAIL;
644
645 cItems = InsertShellNewItems(m_hSubMenu, idCmdFirst, 0);
646
647 ZeroMemory(&mii, sizeof(mii));
648 mii.cbSize = sizeof(mii);
650 mii.fType = MFT_STRING;
651 mii.wID = -1;
652 mii.dwTypeData = wszNew;
653 mii.cch = wcslen(mii.dwTypeData);
654 mii.fState = MFS_ENABLED;
655 mii.hSubMenu = m_hSubMenu;
656
657 if (!InsertMenuItemW(hMenu, indexMenu, TRUE, &mii))
658 return E_FAIL;
659
660 return MAKE_HRESULT(SEVERITY_SUCCESS, 0, cItems);
661}
662
664WINAPI
666{
667 HRESULT hr = E_FAIL;
668
669 if (m_idCmdFirst + LOWORD(lpici->lpVerb) == m_idCmdFolder)
670 {
671 hr = CreateNewFolder(lpici);
672 }
673 else
674 {
676 if (pItem)
677 hr = CreateNewItem(pItem, lpici);
678 }
679
680 TRACE("CNewMenu::InvokeCommand %x\n", hr);
681 return hr;
682}
683
685WINAPI
687 UINT uType,
688 UINT *pwReserved,
689 LPSTR pszName,
690 UINT cchMax)
691{
692 FIXME("%p %lu %u %p %p %u\n", this,
693 idCmd, uType, pwReserved, pszName, cchMax );
694
695 return E_NOTIMPL;
696}
697
699WINAPI
701{
702 return S_OK;
703}
704
706WINAPI
708{
709 switch (uMsg)
710 {
711 case WM_MEASUREITEM:
712 {
713 MEASUREITEMSTRUCT* lpmis = reinterpret_cast<MEASUREITEMSTRUCT*>(lParam);
714 if (!lpmis || lpmis->CtlType != ODT_MENU)
715 break;
716
719 if (lpmis->itemHeight < 16)
720 lpmis->itemHeight = 16;
721
722 if (plResult)
723 *plResult = TRUE;
724 break;
725 }
726 case WM_DRAWITEM:
727 {
728 DRAWITEMSTRUCT* lpdis = reinterpret_cast<DRAWITEMSTRUCT*>(lParam);
729 if (!lpdis || lpdis->CtlType != ODT_MENU)
730 break;
731
732 DWORD id = LOWORD(lpdis->itemID);
733 HICON hIcon = NULL;
734 if (m_idCmdFirst + id == m_idCmdFolder)
735 {
737 }
738 else if (m_idCmdFirst + id == m_idCmdLink)
739 {
741 }
742 else
743 {
745 if (pItem)
746 hIcon = pItem->hIcon;
747 }
748
749 if (!hIcon)
750 break;
751
752 DrawIconEx(lpdis->hDC,
753 2,
754 lpdis->rcItem.top + (lpdis->rcItem.bottom - lpdis->rcItem.top - 16) / 2,
755 hIcon,
756 16,
757 16,
758 0, NULL, DI_NORMAL);
759
760 if(plResult)
761 *plResult = TRUE;
762 }
763 }
764
765 return S_OK;
766}
767
770 IDataObject *pdtobj, HKEY hkeyProgID)
771{
772 m_pidlFolder = ILClone(pidlFolder);
773
774 /* Load folder and shortcut icons */
777 return S_OK;
778}
const WCHAR ShellNewKey[]
Definition: CNewMenu.h:26
#define shell32_hInstance
UINT cchMax
Type
Definition: Type.h:7
char ACPI_OBJECT_TYPE * Types
Definition: acdebug.h:354
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
void shell(int argc, const char *argv[])
Definition: cmds.c:1231
#define IDI_SHELL_FOLDER
Definition: treeview.c:36
#define STDMETHODCALLTYPE
Definition: bdasup.h:9
#define FIXME(fmt,...)
Definition: debug.h:111
#define ERR(fmt,...)
Definition: debug.h:110
#define RegCloseKey(hKey)
Definition: registry.h:47
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
HRESULT SelectNewItem(LONG wEventId, UINT uFlags, LPWSTR pszName, BOOL bRename)
Definition: CNewMenu.cpp:407
UINT InsertShellNewItems(HMENU hMenu, UINT idFirst, UINT idMenu)
Definition: CNewMenu.cpp:317
HICON m_hIconFolder
Definition: CNewMenu.h:62
HRESULT NewItemByNonCommand(SHELLNEW_ITEM *pItem, LPWSTR wszName, DWORD cchNameMax, LPCWSTR wszPath)
Definition: CNewMenu.cpp:518
virtual HRESULT STDMETHODCALLTYPE SetSite(IUnknown *pUnkSite)
Definition: CNewMenu.cpp:612
CNewMenu()
Definition: CNewMenu.cpp:28
virtual HRESULT WINAPI InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
Definition: CNewMenu.cpp:665
SHELLNEW_TYPE
Definition: CNewMenu.h:37
@ SHELLNEW_TYPE_COMMAND
Definition: CNewMenu.h:39
@ SHELLNEW_TYPE_FILENAME
Definition: CNewMenu.h:41
@ SHELLNEW_TYPE_DATA
Definition: CNewMenu.h:40
@ SHELLNEW_TYPE_NULLFILE
Definition: CNewMenu.h:42
@ SHELLNEW_TYPE_INVALID
Definition: CNewMenu.h:38
virtual HRESULT WINAPI HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: CNewMenu.cpp:700
virtual HRESULT WINAPI QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)
Definition: CNewMenu.cpp:625
virtual HRESULT STDMETHODCALLTYPE GetSite(REFIID riid, void **ppvSite)
Definition: CNewMenu.cpp:618
UINT m_idCmdLink
Definition: CNewMenu.h:61
LPITEMIDLIST m_pidlFolder
Definition: CNewMenu.h:56
virtual HRESULT STDMETHODCALLTYPE Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID)
Definition: CNewMenu.cpp:769
BOOL LoadCachedItems()
Definition: CNewMenu.cpp:242
void UnloadItem(SHELLNEW_ITEM *pItem)
Definition: CNewMenu.cpp:49
BOOL LoadAllItems()
Definition: CNewMenu.cpp:300
SHELLNEW_ITEM * m_pLinkItem
Definition: CNewMenu.h:58
HICON m_hIconLink
Definition: CNewMenu.h:62
HRESULT CreateNewItem(SHELLNEW_ITEM *pItem, LPCMINVOKECOMMANDINFO lpcmi)
Definition: CNewMenu.cpp:575
HMENU m_hSubMenu
Definition: CNewMenu.h:60
void UnloadAllItems()
Definition: CNewMenu.cpp:62
SHELLNEW_ITEM * LoadItem(LPCWSTR pwszExt)
Definition: CNewMenu.cpp:77
virtual HRESULT WINAPI GetCommandString(UINT_PTR idCommand, UINT uFlags, UINT *lpReserved, LPSTR lpszName, UINT uMaxNameLen)
Definition: CNewMenu.cpp:686
SHELLNEW_ITEM * m_pItems
Definition: CNewMenu.h:57
~CNewMenu()
Definition: CNewMenu.cpp:41
UINT m_idCmdFirst
Definition: CNewMenu.h:61
UINT m_idCmdFolder
Definition: CNewMenu.h:61
virtual HRESULT WINAPI HandleMenuMsg2(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plResult)
Definition: CNewMenu.cpp:707
HRESULT NewItemByCommand(SHELLNEW_ITEM *pItem, LPCWSTR wszPath)
Definition: CNewMenu.cpp:475
HRESULT CreateNewFolder(LPCMINVOKECOMMANDINFO lpici)
Definition: CNewMenu.cpp:446
SHELLNEW_ITEM * FindItemFromIdOffset(UINT IdOffset)
Definition: CNewMenu.cpp:385
BOOL CacheItems()
Definition: CNewMenu.cpp:170
CComPtr< IUnknown > m_pSite
Definition: CNewMenu.h:59
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
ush Pos
Definition: deflate.h:92
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3356
LSTATUS WINAPI RegGetValueW(HKEY hKey, LPCWSTR pszSubKey, LPCWSTR pszValue, DWORD dwFlags, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData)
Definition: reg.c:1965
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4900
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4121
LONG WINAPI RegEnumKeyW(HKEY hKey, DWORD dwIndex, LPWSTR lpName, DWORD cbName)
Definition: reg.c:2416
UINT uFlags
Definition: api.c:59
#define CloseHandle
Definition: compat.h:739
#define GetProcessHeap()
Definition: compat.h:736
#define CP_ACP
Definition: compat.h:109
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define HeapAlloc
Definition: compat.h:733
#define MAX_PATH
Definition: compat.h:34
#define HeapFree(x, y, z)
Definition: compat.h:735
#define CreateFileW
Definition: compat.h:741
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
#define WideCharToMultiByte
Definition: compat.h:111
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
#define wcsicmp
Definition: compat.h:15
DWORD WINAPI ExpandEnvironmentStringsW(IN LPCWSTR lpSrc, IN LPWSTR lpDst, IN DWORD nSize)
Definition: environ.c:519
BOOL WINAPI CopyFileW(IN LPCWSTR lpExistingFileName, IN LPCWSTR lpNewFileName, IN BOOL bFailIfExists)
Definition: copy.c:439
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessW(LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation)
Definition: proc.c:4593
#define RRF_RT_REG_SZ
Definition: driver.c:575
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:326
BOOL WINAPI PathYetAnotherMakeUniqueName(LPWSTR buffer, LPCWSTR path, LPCWSTR shortname, LPCWSTR longname)
Definition: shellpath.c:705
HRESULT WINAPI IUnknown_QueryService(IUnknown *, REFGUID, REFIID, LPVOID *)
Definition: ordinal.c:1494
#define MAKE_HRESULT(sev, fac, code)
Definition: dmerror.h:30
static BOOLEAN bSuccess
Definition: drive.cpp:433
#define ULONG_PTR
Definition: config.h:101
#define IDS_NEWFOLDER
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
Definition: fsrtlfuncs.h:898
FxAutoRegKey hKey
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
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
_CONST_RETURN wchar_t *__cdecl wcsstr(_In_z_ const wchar_t *_Str, _In_z_ const wchar_t *_SubStr)
REFIID riid
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define debugstr_w
Definition: kernel32.h:32
#define REG_SZ
Definition: layer.c:22
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define CREATE_NEW
Definition: disk.h:69
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
static HICON
Definition: imagelist.c:84
static refpint_t pi[]
Definition: server.c:96
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
HICON hIcon
Definition: msconfig.c:44
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
_In_ HANDLE hFile
Definition: mswsock.h:90
unsigned int UINT
Definition: ndis.h:50
#define KEY_READ
Definition: nt_native.h:1023
#define REG_OPTION_NON_VOLATILE
Definition: nt_native.h:1057
#define REG_MULTI_SZ
Definition: nt_native.h:1501
#define KEY_WRITE
Definition: nt_native.h:1031
#define GENERIC_WRITE
Definition: nt_native.h:90
#define REG_EXPAND_SZ
Definition: nt_native.h:1494
#define L(x)
Definition: ntvdm.h:50
#define LOWORD(l)
Definition: pedump.c:82
BYTE * PBYTE
Definition: pedump.c:66
long LONG
Definition: pedump.c:60
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:228
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:925
HRESULT WINAPI SHILCreateFromPathW(LPCWSTR path, LPITEMIDLIST *ppidl, DWORD *attributes)
Definition: pidl.c:392
LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl)
Definition: pidl.c:189
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1294
#define REFIID
Definition: guiddef.h:118
_Check_return_ _CRTIMP wchar_t *__cdecl _wcsdup(_In_z_ const wchar_t *_Str)
DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path, DWORD dwFileAttributes, SHFILEINFOW *psfi, UINT sizeofpsfi, UINT flags)
Definition: shell32_main.c:414
#define SHGFI_ICON
Definition: shellapi.h:161
#define SHGFI_TYPENAME
Definition: shellapi.h:164
#define SHGFI_USEFILEATTRIBUTES
Definition: shellapi.h:178
#define SHGFI_SMALLICON
Definition: shellapi.h:173
#define FAILED_UNEXPECTEDLY(hr)
Definition: shellutils.h:82
int WINAPI SHCreateDirectory(HWND hWnd, LPCWSTR path)
Definition: shlfileop.cpp:857
HRESULT hr
Definition: shlfolder.c:183
#define SID_IFolderView
#define SHCNE_MKDIR
Definition: shlobj.h:1745
#define SHCNE_CREATE
Definition: shlobj.h:1743
#define SHCNF_PATHW
Definition: shlobj.h:1777
#define FCIDM_SHVIEW_NEW
Definition: shresdef.h:138
#define FCIDM_SHVIEW_NEWFOLDER
Definition: shresdef.h:824
#define IDI_SHELL_SHORTCUT
Definition: shresdef.h:559
#define FCIDM_SHVIEW_NEWLINK
Definition: shresdef.h:823
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
#define _countof(array)
Definition: sndvol32.h:68
#define TRACE(s)
Definition: solgame.cpp:4
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:530
STRSAFEAPI StringCbPrintfW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:557
SHELLNEW_ITEM * pNext
Definition: CNewMenu.h:53
SHELLNEW_TYPE Type
Definition: CNewMenu.h:47
WCHAR szTypeName[80]
Definition: shellapi.h:373
HICON hIcon
Definition: shellapi.h:369
DWORD cb
Definition: winbase.h:852
ULONG_PTR dwItemData
Definition: winuser.h:3258
LPWSTR dwTypeData
Definition: winuser.h:3259
LONG bottom
Definition: windef.h:309
LONG top
Definition: windef.h:307
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1830
unsigned char * LPBYTE
Definition: typedefs.h:53
#define ZeroMemory
Definition: winbase.h:1670
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
LONG_PTR LPARAM
Definition: windef.h:208
LONG_PTR LRESULT
Definition: windef.h:209
UINT_PTR WPARAM
Definition: windef.h:207
CONST void * LPCVOID
Definition: windef.h:191
#define WINAPI
Definition: msvc.h:6
#define SEVERITY_SUCCESS
Definition: winerror.h:64
#define DI_NORMAL
Definition: wingdi.h:72
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define RegCreateKeyEx
Definition: winreg.h:501
#define RRF_RT_ANY
Definition: winreg.h:64
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10
#define MIIM_STRING
Definition: winuser.h:722
#define MIIM_ID
Definition: winuser.h:717
#define IMAGE_ICON
Definition: winuser.h:212
#define SM_CXMENUCHECK
Definition: winuser.h:1025
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
HMENU WINAPI CreateMenu(void)
Definition: menu.c:837
#define MFT_SEPARATOR
Definition: winuser.h:739
int WINAPI MessageBoxW(_In_opt_ HWND hWnd, _In_opt_ LPCWSTR lpText, _In_opt_ LPCWSTR lpCaption, _In_ UINT uType)
#define WM_DRAWITEM
Definition: winuser.h:1635
#define MIIM_STATE
Definition: winuser.h:716
#define MB_ICONERROR
Definition: winuser.h:781
#define MIIM_SUBMENU
Definition: winuser.h:718
#define MIIM_BITMAP
Definition: winuser.h:723
BOOL WINAPI DrawIconEx(_In_ HDC, _In_ int, _In_ int, _In_ HICON, _In_ int, _In_ int, _In_ UINT, _In_opt_ HBRUSH, _In_ UINT)
Definition: cursoricon.c:1997
#define LR_SHARED
Definition: winuser.h:1094
#define MB_OK
Definition: winuser.h:784
#define WM_MEASUREITEM
Definition: winuser.h:1636
#define MFS_ENABLED
Definition: winuser.h:745
#define LoadImage
Definition: winuser.h:5805
BOOL WINAPI GetMenuItemInfoW(_In_ HMENU, _In_ UINT, _In_ BOOL, _Inout_ LPMENUITEMINFOW)
#define MFT_STRING
Definition: winuser.h:741
#define MAKEINTRESOURCE
Definition: winuser.h:591
#define ODT_MENU
Definition: winuser.h:2527
#define HBMMENU_CALLBACK
Definition: winuser.h:2620
int WINAPI GetSystemMetrics(_In_ int)
#define MIIM_DATA
Definition: winuser.h:721
#define MIIM_TYPE
Definition: winuser.h:720
BOOL WINAPI InsertMenuItemW(_In_ HMENU, _In_ UINT, _In_ BOOL, _In_ LPCMENUITEMINFOW)
BOOL WINAPI DestroyIcon(_In_ HICON)
Definition: cursoricon.c:2022
#define IID_PPV_ARG(Itype, ppType)
char * LPSTR
Definition: xmlstorage.h:182
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185