ReactOS 0.4.17-dev-357-ga8f14ff
CStartMenu.cpp File Reference
#include "shellmenu.h"
#include "CMergedFolder.h"
Include dependency graph for CStartMenu.cpp:

Go to the source code of this file.

Classes

class  CShellMenuCallback
 

Macros

#define IDM_STARTMENUROOT   ( (UINT)-1 )
 
#define IDM_RUN   401
 
#define IDM_LOGOFF   402
 
#define IDM_UNDOCKCOMPUTER   410
 
#define IDM_TASKBARANDSTARTMENU   413
 
#define IDM_LASTSTARTMENU_SEPARATOR   450
 
#define IDM_DOCUMENTS   501
 
#define IDM_HELPANDSUPPORT   503
 
#define IDM_PROGRAMS   504
 
#define IDM_CONTROLPANEL   505
 
#define IDM_SHUTDOWN   506
 
#define IDM_FAVORITES   507
 
#define IDM_SETTINGS   508
 
#define IDM_PRINTERSANDFAXES   510
 
#define IDM_SEARCH   520
 
#define IDM_SYNCHRONIZE   553
 
#define IDM_NETWORKCONNECTIONS   557
 
#define IDM_DISCONNECT   5000
 
#define IDM_SECURITY   5001
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (CStartMenu)
 
HRESULT BindToDesktop (LPCITEMIDLIST pidl, IShellFolder **ppsfResult)
 
static HRESULT GetMergedFolder (int folder1, int folder2, IShellFolder **ppsfStartMenu)
 
static HRESULT GetStartMenuFolder (IShellFolder **ppsfStartMenu)
 
static HRESULT GetProgramsFolder (IShellFolder **ppsfStartMenu)
 
HRESULT WINAPI RSHELL_CStartMenu_CreateInstance (REFIID riid, void **ppv)
 

Macro Definition Documentation

◆ IDM_CONTROLPANEL

#define IDM_CONTROLPANEL   505

Definition at line 40 of file CStartMenu.cpp.

◆ IDM_DISCONNECT

#define IDM_DISCONNECT   5000

Definition at line 48 of file CStartMenu.cpp.

◆ IDM_DOCUMENTS

#define IDM_DOCUMENTS   501

Definition at line 37 of file CStartMenu.cpp.

◆ IDM_FAVORITES

#define IDM_FAVORITES   507

Definition at line 42 of file CStartMenu.cpp.

◆ IDM_HELPANDSUPPORT

#define IDM_HELPANDSUPPORT   503

Definition at line 38 of file CStartMenu.cpp.

◆ IDM_LASTSTARTMENU_SEPARATOR

#define IDM_LASTSTARTMENU_SEPARATOR   450

Definition at line 36 of file CStartMenu.cpp.

◆ IDM_LOGOFF

#define IDM_LOGOFF   402

Definition at line 33 of file CStartMenu.cpp.

◆ IDM_NETWORKCONNECTIONS

#define IDM_NETWORKCONNECTIONS   557

Definition at line 47 of file CStartMenu.cpp.

◆ IDM_PRINTERSANDFAXES

#define IDM_PRINTERSANDFAXES   510

Definition at line 44 of file CStartMenu.cpp.

◆ IDM_PROGRAMS

#define IDM_PROGRAMS   504

Definition at line 39 of file CStartMenu.cpp.

◆ IDM_RUN

#define IDM_RUN   401

Definition at line 32 of file CStartMenu.cpp.

◆ IDM_SEARCH

#define IDM_SEARCH   520

Definition at line 45 of file CStartMenu.cpp.

◆ IDM_SECURITY

#define IDM_SECURITY   5001

Definition at line 49 of file CStartMenu.cpp.

◆ IDM_SETTINGS

#define IDM_SETTINGS   508

Definition at line 43 of file CStartMenu.cpp.

◆ IDM_SHUTDOWN

#define IDM_SHUTDOWN   506

Definition at line 41 of file CStartMenu.cpp.

◆ IDM_STARTMENUROOT

#define IDM_STARTMENUROOT   ( (UINT)-1 )

Definition at line 28 of file CStartMenu.cpp.

◆ IDM_SYNCHRONIZE

#define IDM_SYNCHRONIZE   553

Definition at line 46 of file CStartMenu.cpp.

◆ IDM_TASKBARANDSTARTMENU

#define IDM_TASKBARANDSTARTMENU   413

Definition at line 35 of file CStartMenu.cpp.

◆ IDM_UNDOCKCOMPUTER

#define IDM_UNDOCKCOMPUTER   410

Definition at line 34 of file CStartMenu.cpp.

Function Documentation

◆ BindToDesktop()

HRESULT BindToDesktop ( LPCITEMIDLIST  pidl,
IShellFolder **  ppsfResult 
)

Definition at line 494 of file CStartMenu.cpp.

495{
496 HRESULT hr;
497 CComPtr<IShellFolder> psfDesktop;
498
499 *ppsfResult = NULL;
500
501 hr = SHGetDesktopFolder(&psfDesktop);
502 if (FAILED(hr))
503 return hr;
504
505 hr = psfDesktop->BindToObject(pidl, NULL, IID_PPV_ARG(IShellFolder, ppsfResult));
506
507 return hr;
508}
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
#define FAILED(hr)
Definition: intsafe.h:51
#define IID_PPV_ARG(Itype, ppType)

Referenced by GetMergedFolder().

◆ GetMergedFolder()

static HRESULT GetMergedFolder ( int  folder1,
int  folder2,
IShellFolder **  ppsfStartMenu 
)
static

Definition at line 510 of file CStartMenu.cpp.

511{
512 HRESULT hr;
513 LPITEMIDLIST pidlUserStartMenu;
514 LPITEMIDLIST pidlCommonStartMenu;
515 CComPtr<IShellFolder> psfUserStartMenu;
516 CComPtr<IShellFolder> psfCommonStartMenu;
517 CComPtr<IAugmentedShellFolder> pasf;
518
519 *ppsfStartMenu = NULL;
520
521 hr = SHGetSpecialFolderLocation(NULL, folder1, &pidlUserStartMenu);
522 if (FAILED(hr))
523 {
524 WARN("Failed to get the USER start menu folder. Trying to run with just the COMMON one.\n");
525
526 hr = SHGetSpecialFolderLocation(NULL, folder2, &pidlCommonStartMenu);
528 return hr;
529
530 TRACE("COMMON start menu obtained.\n");
531 hr = BindToDesktop(pidlCommonStartMenu, ppsfStartMenu);
532 ILFree(pidlCommonStartMenu);
533 return hr;
534 }
535#if MERGE_FOLDERS
536 hr = SHGetSpecialFolderLocation(NULL, folder2, &pidlCommonStartMenu);
538#else
539 else
540#endif
541 {
542 WARN("Failed to get the COMMON start menu folder. Will use only the USER contents.\n");
543 hr = BindToDesktop(pidlUserStartMenu, ppsfStartMenu);
544 ILFree(pidlUserStartMenu);
545 return hr;
546 }
547
548 TRACE("Both COMMON and USER statr menu folders obtained, merging them...\n");
549
550 hr = BindToDesktop(pidlUserStartMenu, &psfUserStartMenu);
552 return hr;
553
554 hr = BindToDesktop(pidlCommonStartMenu, &psfCommonStartMenu);
556 return hr;
557
558 hr = CMergedFolder_CreateInstance(IID_PPV_ARG(IAugmentedShellFolder, &pasf));
560 {
561 *ppsfStartMenu = psfUserStartMenu.Detach();
562 ILFree(pidlCommonStartMenu);
563 ILFree(pidlUserStartMenu);
564 return hr;
565 }
566
567 hr = pasf->AddNameSpace(NULL, psfUserStartMenu, pidlUserStartMenu, 0xFF00);
569 return hr;
570
571 hr = pasf->AddNameSpace(NULL, psfCommonStartMenu, pidlCommonStartMenu, 0);
573 return hr;
574
575 hr = pasf->QueryInterface(IID_PPV_ARG(IShellFolder, ppsfStartMenu));
576 pasf.Release();
577
578 ILFree(pidlCommonStartMenu);
579 ILFree(pidlUserStartMenu);
580
581 return hr;
582}
HRESULT BindToDesktop(LPCITEMIDLIST pidl, IShellFolder **ppsfResult)
Definition: CStartMenu.cpp:494
#define WARN(fmt,...)
Definition: precomp.h:61
HRESULT WINAPI SHGetSpecialFolderLocation(HWND hwndOwner, INT nFolder, LPITEMIDLIST *ppidl)
Definition: shellpath.c:3384
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:33
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
ULONG Release()
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:1051
#define CMergedFolder_CreateInstance
Definition: shellmenu.h:92
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
#define TRACE(s)
Definition: solgame.cpp:4

Referenced by GetProgramsFolder(), and GetStartMenuFolder().

◆ GetProgramsFolder()

static HRESULT GetProgramsFolder ( IShellFolder **  ppsfStartMenu)
static

Definition at line 589 of file CStartMenu.cpp.

590{
592}
static HRESULT GetMergedFolder(int folder1, int folder2, IShellFolder **ppsfStartMenu)
Definition: CStartMenu.cpp:510
#define CSIDL_COMMON_PROGRAMS
Definition: shlobj.h:2203
#define CSIDL_PROGRAMS
Definition: shlobj.h:2183

Referenced by RSHELL_CStartMenu_CreateInstance().

◆ GetStartMenuFolder()

static HRESULT GetStartMenuFolder ( IShellFolder **  ppsfStartMenu)
static

Definition at line 584 of file CStartMenu.cpp.

585{
587}
#define CSIDL_COMMON_STARTMENU
Definition: shlobj.h:2202
#define CSIDL_STARTMENU
Definition: shlobj.h:2192

Referenced by RSHELL_CStartMenu_CreateInstance().

◆ RSHELL_CStartMenu_CreateInstance()

HRESULT WINAPI RSHELL_CStartMenu_CreateInstance ( REFIID  riid,
void **  ppv 
)

Definition at line 596 of file CStartMenu.cpp.

597{
598 CComPtr<IShellMenu> pShellMenu;
599 CComPtr<IBandSite> pBandSite;
600 CComPtr<IDeskBar> pDeskBar;
601
602 HRESULT hr;
603 IShellFolder * psf;
604
605 LPITEMIDLIST pidlProgramsAbsolute;
606 LPITEMIDLIST pidlPrograms;
607 CComPtr<IShellFolder> psfPrograms;
608
611 return hr;
612
615 return hr;
616
619 return hr;
620
621 CComObject<CShellMenuCallback> *pCallback;
622 hr = CComObject<CShellMenuCallback>::CreateInstance(&pCallback);
624 return hr;
625
626 pCallback->AddRef(); // CreateInstance returns object with 0 ref count */
627 pCallback->Initialize(pShellMenu, pBandSite, pDeskBar);
628
629 hr = pShellMenu->Initialize(pCallback, IDM_STARTMENUROOT, 0, SMINIT_TOPLEVEL | SMINIT_VERTICAL);
631 return hr;
632
633 hr = GetStartMenuFolder(&psf);
635 return hr;
636
637 /* psf is a merged folder, so now we want to get the pidl of the programs item from the merged folder */
638 {
639 hr = SHGetSpecialFolderLocation(NULL, CSIDL_PROGRAMS, &pidlProgramsAbsolute);
641 {
642 WARN("USER Programs folder not found\n");
643 hr = SHGetSpecialFolderLocation(NULL, CSIDL_COMMON_PROGRAMS, &pidlProgramsAbsolute);
645 return hr;
646 }
647
648 LPCITEMIDLIST pcidlPrograms;
649 CComPtr<IShellFolder> psfParent;
650 STRRET str;
651 TCHAR szDisplayName[MAX_PATH];
652
653 hr = SHBindToParent(pidlProgramsAbsolute, IID_PPV_ARG(IShellFolder, &psfParent), &pcidlPrograms);
655 return hr;
656
657 hr = psfParent->GetDisplayNameOf(pcidlPrograms, SHGDN_FORPARSING | SHGDN_INFOLDER, &str);
659 return hr;
660
661 StrRetToBuf(&str, pcidlPrograms, szDisplayName, _countof(szDisplayName));
662 ILFree(pidlProgramsAbsolute);
663
664 /* We got the display name from the fs folder and we parse it with the merged folder here */
665 hr = psf->ParseDisplayName(NULL, NULL, szDisplayName, NULL, &pidlPrograms, NULL);
667 return hr;
668 }
669
670 hr = GetProgramsFolder(&psfPrograms);
672 return hr;
673
674 hr = pCallback->_SetProgramsFolder(psfPrograms, pidlPrograms);
676 return hr;
677
678 hr = pShellMenu->SetShellFolder(psf, NULL, NULL, SMSET_TOP);
680 return hr;
681
682 hr = pDeskBar->SetClient(pBandSite);
684 return hr;
685
686 hr = pBandSite->AddBand(pShellMenu);
688 return hr;
689
690 return pDeskBar->QueryInterface(riid, ppv);
691}
static HRESULT GetProgramsFolder(IShellFolder **ppsfStartMenu)
Definition: CStartMenu.cpp:589
static HRESULT GetStartMenuFolder(IShellFolder **ppsfStartMenu)
Definition: CStartMenu.cpp:584
#define IDM_STARTMENUROOT
Definition: CStartMenu.cpp:28
#define MAX_PATH
Definition: compat.h:34
FxPnpStateCallbackInfo * pCallback
char TCHAR
Definition: tchar.h:1402
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
HRESULT ParseDisplayName([in] HWND hwndOwner, [in] LPBC pbcReserved, [in, string] LPOLESTR lpszDisplayName, [out] ULONG *pchEaten, [out] PIDLIST_RELATIVE *ppidl, [in, out, unique] ULONG *pdwAttributes)
HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCITEMIDLIST *ppidlLast)
Definition: pidl.c:1504
#define StrRetToBuf
Definition: shlwapi.h:1241
const WCHAR * str
#define CMenuSite_CreateInstance
Definition: shellmenu.h:86
#define CMenuDeskBar_CreateInstance
Definition: shellmenu.h:74
#define CMenuBand_CreateInstance
Definition: shellmenu.h:80
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
#define _countof(array)
Definition: sndvol32.h:70

Referenced by CRShellClassFactory::CreateInstance(), and CStartMenuDummy::_CreatorClass::CreateInstance().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( CStartMenu  )