ReactOS 0.4.15-dev-6656-gbbb33a6
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 | SHCNF_FLUSH, (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{
522
523 CStringW strNewItem;
524 strNewItem.Format(IDS_NEWITEMFORMAT, pItem->pwszDesc);
525 strNewItem += pItem->pwszExt;
526
527 /* Create the name of the new file */
528 if (!PathYetAnotherMakeUniqueName(wszName, wszPath, NULL, strNewItem))
529 return E_FAIL;
530
531 /* Create new file */
534 {
535 if (pItem->Type == SHELLNEW_TYPE_DATA)
536 {
537 /* Write a content */
538 DWORD cbWritten;
539 WriteFile(hFile, pItem->pData, pItem->cbData, &cbWritten, NULL);
540 }
541
542 /* Close file now */
544 }
545 else
546 {
547 bSuccess = FALSE;
548 }
549
550 if (pItem->Type == SHELLNEW_TYPE_FILENAME)
551 {
552 /* Copy file */
553 if (!CopyFileW((LPWSTR)pItem->pData, wszName, FALSE))
554 ERR("Copy file failed: %ls\n", (LPWSTR)pItem->pData);
555 }
556
557 /* Show message if we failed */
558 if (bSuccess)
559 {
560 TRACE("Notifying fs %s\n", debugstr_w(wszName));
562 }
563 else
564 {
567 Message.FormatMessage(Message.GetString(), wszName);
569 }
570
571 return S_OK;
572}
573
575{
576 HRESULT hr;
577 WCHAR wszPath[MAX_PATH], wszName[MAX_PATH];
578
579 /* Get folder path */
582 return hr;
583
584 if (pItem == m_pLinkItem)
585 {
586 NewItemByNonCommand(pItem, wszName, _countof(wszName), wszPath);
587 NewItemByCommand(pItem, wszName);
588 return S_OK;
589 }
590
591 switch (pItem->Type)
592 {
594 NewItemByCommand(pItem, wszPath);
595 break;
596
600 NewItemByNonCommand(pItem, wszName, _countof(wszName), wszPath);
601 break;
602
604 ERR("Invalid type\n");
605 break;
606 }
607
608 return S_OK;
609}
610
612{
613 m_pSite = pUnkSite;
614 return S_OK;
615}
616
618{
619 return m_pSite->QueryInterface(riid, ppvSite);
620}
621
623WINAPI
625 UINT indexMenu,
626 UINT idCmdFirst,
627 UINT idCmdLast,
628 UINT uFlags)
629{
630 MENUITEMINFOW mii;
631 UINT cItems = 0;
632 WCHAR wszNew[200];
633
634 TRACE("%p %p %u %u %u %u\n", this,
635 hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
636
638 return E_FAIL;
639
641 if (!m_hSubMenu)
642 return E_FAIL;
643
644 cItems = InsertShellNewItems(m_hSubMenu, idCmdFirst, 0);
645
646 ZeroMemory(&mii, sizeof(mii));
647 mii.cbSize = sizeof(mii);
649 mii.fType = MFT_STRING;
650 mii.wID = -1;
651 mii.dwTypeData = wszNew;
652 mii.cch = wcslen(mii.dwTypeData);
653 mii.fState = MFS_ENABLED;
654 mii.hSubMenu = m_hSubMenu;
655
656 if (!InsertMenuItemW(hMenu, indexMenu, TRUE, &mii))
657 return E_FAIL;
658
659 return MAKE_HRESULT(SEVERITY_SUCCESS, 0, cItems);
660}
661
663WINAPI
665{
666 HRESULT hr = E_FAIL;
667
668 if (m_idCmdFirst + LOWORD(lpici->lpVerb) == m_idCmdFolder)
669 {
670 hr = CreateNewFolder(lpici);
671 }
672 else
673 {
675 if (pItem)
676 hr = CreateNewItem(pItem, lpici);
677 }
678
679 TRACE("CNewMenu::InvokeCommand %x\n", hr);
680 return hr;
681}
682
684WINAPI
686 UINT uType,
687 UINT *pwReserved,
688 LPSTR pszName,
689 UINT cchMax)
690{
691 FIXME("%p %lu %u %p %p %u\n", this,
692 idCmd, uType, pwReserved, pszName, cchMax );
693
694 return E_NOTIMPL;
695}
696
698WINAPI
700{
701 return S_OK;
702}
703
705WINAPI
707{
708 switch (uMsg)
709 {
710 case WM_MEASUREITEM:
711 {
712 MEASUREITEMSTRUCT* lpmis = reinterpret_cast<MEASUREITEMSTRUCT*>(lParam);
713 if (!lpmis || lpmis->CtlType != ODT_MENU)
714 break;
715
718 if (lpmis->itemHeight < 16)
719 lpmis->itemHeight = 16;
720
721 if (plResult)
722 *plResult = TRUE;
723 break;
724 }
725 case WM_DRAWITEM:
726 {
727 DRAWITEMSTRUCT* lpdis = reinterpret_cast<DRAWITEMSTRUCT*>(lParam);
728 if (!lpdis || lpdis->CtlType != ODT_MENU)
729 break;
730
731 DWORD id = LOWORD(lpdis->itemID);
732 HICON hIcon = NULL;
733 if (m_idCmdFirst + id == m_idCmdFolder)
734 {
736 }
737 else if (m_idCmdFirst + id == m_idCmdLink)
738 {
740 }
741 else
742 {
744 if (pItem)
745 hIcon = pItem->hIcon;
746 }
747
748 if (!hIcon)
749 break;
750
751 DrawIconEx(lpdis->hDC,
752 2,
753 lpdis->rcItem.top + (lpdis->rcItem.bottom - lpdis->rcItem.top - 16) / 2,
754 hIcon,
755 16,
756 16,
757 0, NULL, DI_NORMAL);
758
759 if(plResult)
760 *plResult = TRUE;
761 }
762 }
763
764 return S_OK;
765}
766
769 IDataObject *pdtobj, HKEY hkeyProgID)
770{
771 m_pidlFolder = ILClone(pidlFolder);
772
773 /* Load folder and shortcut icons */
776 return S_OK;
777}
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)
void __cdecl Format(UINT nFormatID,...)
Definition: cstringt.h:818
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:611
CNewMenu()
Definition: CNewMenu.cpp:28
virtual HRESULT WINAPI InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
Definition: CNewMenu.cpp:664
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:699
virtual HRESULT WINAPI QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)
Definition: CNewMenu.cpp:624
virtual HRESULT STDMETHODCALLTYPE GetSite(REFIID riid, void **ppvSite)
Definition: CNewMenu.cpp:617
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:768
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:574
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:685
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:706
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:3353
LSTATUS WINAPI RegGetValueW(HKEY hKey, LPCWSTR pszSubKey, LPCWSTR pszValue, DWORD dwFlags, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData)
Definition: reg.c:1962
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:4897
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4118
LONG WINAPI RegEnumKeyW(HKEY hKey, DWORD dwIndex, LPWSTR lpName, DWORD cbName)
Definition: reg.c:2413
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:4592
#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:1497
static const WCHAR Message[]
Definition: register.c:74
#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:63
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:929
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:1298
#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:415
#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:1749
#define SHCNE_CREATE
Definition: shlobj.h:1747
#define SHCNF_FLUSH
Definition: shlobj.h:1784
#define SHCNF_PATHW
Definition: shlobj.h:1781
#define IDS_NEWITEMFORMAT
Definition: shresdef.h:143
#define FCIDM_SHVIEW_NEW
Definition: shresdef.h:140
#define FCIDM_SHVIEW_NEWFOLDER
Definition: shresdef.h:832
#define IDI_SHELL_SHORTCUT
Definition: shresdef.h:567
#define IDS_CREATEFILE_DENIED
Definition: shresdef.h:121
#define FCIDM_SHVIEW_NEWLINK
Definition: shresdef.h:831
#define IDS_CREATEFILE_CAPTION
Definition: shresdef.h:120
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
#define _countof(array)
Definition: sndvol32.h:68
#define TRACE(s)
Definition: solgame.cpp:4
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:1700
_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:829
#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 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_ICONEXCLAMATION
Definition: winuser.h:779
#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 MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#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