#include "CMergedFolder.h"
+// TODO: declare these GUIDs and interfaces in the right place (whatever that may be)
+IID IID_IAugmentedShellFolder = { 0x91EA3F8C, 0xC99B, 0x11D0, { 0x98, 0x15, 0x00, 0xC0, 0x4F, 0xD9, 0x19, 0x72 } };
+IID IID_IAugmentedShellFolder2 = { 0x8DB3B3F4, 0x6CFE, 0x11D1, { 0x8A, 0xE9, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0xD0 } };
+CLSID CLSID_MergedFolder = { 0x26FDC864, 0xBE88, 0x46E7, { 0x92, 0x35, 0x03, 0x2D, 0x8E, 0xA5, 0x16, 0x2E } };
+
//#define TEST_TRACKPOPUPMENU_SUBMENUS
int csidl = 0;
IShellMenu *pShellMenu;
+#if USE_SYSTEM_MENUBAND
+ hr = CoCreateInstance(CLSID_MenuBand,
+ NULL,
+ CLSCTX_INPROC_SERVER,
+ IID_PPV_ARG(IShellMenu, &pShellMenu));
+#else
hr = CMenuBand_Constructor(IID_PPV_ARG(IShellMenu, &pShellMenu));
+#endif
if (FAILED_UNEXPECTEDLY(hr))
return hr;
HRESULT OnExec(LPSMDATA psmd)
{
+ // H H A CCC K K ! ! !
+ // H H A A C C K K ! ! !
+ // HHHHH AAAAA C KKK ! ! !
+ // H H A A C C K K ! ! !
+ // H H A A CCC K K . . .
+ //
+ // HACK: Instead of running explorer.exe with the path, we should be using ShellExecute to "open" the path directly!
+ // Remove once ShellExecute can handle CLSID path components.
+
if (psmd->uId == IDM_CONTROLPANEL)
- ShellExecuteW(NULL, L"open", L"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}", NULL, NULL, 1);
+ ShellExecuteW(NULL, NULL, L"explorer.exe", L"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}", NULL, SW_SHOWNORMAL);
else if (psmd->uId == IDM_NETWORKCONNECTIONS)
- ShellExecuteW(NULL, L"open", L"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}\\::{7007ACC7-3202-11D1-AAD2-00805FC1270E}", NULL, NULL, 1);
+ ShellExecuteW(NULL, NULL, L"explorer.exe", L"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}\\::{7007ACC7-3202-11D1-AAD2-00805FC1270E}", NULL, SW_SHOWNORMAL);
else if (psmd->uId == IDM_PRINTERSANDFAXES)
- ShellExecuteW(NULL, L"open", L"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}\\::{2227A280-3AEA-1069-A2DE-08002B30309D}", NULL, NULL, 1);
+ {}/* FIXME: crashes: ShellExecuteW(NULL, NULL, L"explorer.exe", L"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}\\::{2227A280-3AEA-1069-A2DE-08002B30309D}", NULL, SW_SHOWNORMAL);*/
else
PostMessageW(m_hwndTray, WM_COMMAND, psmd->uId, 0);
IBandSite* pBandSite,
IDeskBar* pDeskBar)
{
- m_pShellMenu.Attach(pShellMenu);
- m_pBandSite.Attach(pBandSite);
- m_pDeskBar.Attach(pDeskBar);
+ m_pShellMenu = pShellMenu;
+ m_pBandSite = pBandSite;
+ m_pDeskBar = pDeskBar;
}
~CShellMenuCallback()
{
- m_pShellMenu.Release();
- m_pBandSite.Release();
- m_pDeskBar.Release();
}
HRESULT _SetProgramsFolder(IShellFolder * psf, LPITEMIDLIST pidl)
return hr;
}
-HRESULT GetStartMenuFolder(IShellFolder ** ppsfStartMenu)
+static HRESULT GetStartMenuFolder(IShellFolder ** ppsfStartMenu)
{
HRESULT hr;
LPITEMIDLIST pidlUserStartMenu;
LPITEMIDLIST pidlCommonStartMenu;
+ CComPtr<IShellFolder> psfUserStartMenu;
+ CComPtr<IShellFolder> psfCommonStartMenu;
+ CComPtr<IAugmentedShellFolder> pasf;
*ppsfStartMenu = NULL;
return hr;
}
- CComPtr<IShellFolder> psfUserStartMenu;
hr = BindToDesktop(pidlUserStartMenu, &psfUserStartMenu);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
- CComPtr<IShellFolder> psfCommonStartMenu;
hr = BindToDesktop(pidlCommonStartMenu, &psfCommonStartMenu);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
-#if CUSTOM_MERGE_FOLDERS
- IShellFolder * psfMerged;
- hr = CMergedFolder_Constructor(psfUserStartMenu, psfCommonStartMenu, IID_PPV_ARG(IShellFolder, &psfMerged));
- if (FAILED_UNEXPECTEDLY(hr))
- return hr;
+#if 1
+ hr = CMergedFolder_Constructor(IID_PPV_ARG(IAugmentedShellFolder, &pasf));
#else
- CComPtr<IAugmentedShellFolder> pasf;
hr = CoCreateInstance(CLSID_MergedFolder, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IAugmentedShellFolder, &pasf));
+#endif
if (FAILED_UNEXPECTEDLY(hr))
{
- hr = BindToDesktop(pidlUserStartMenu, ppsfStartMenu);
+ *ppsfStartMenu = psfUserStartMenu.Detach();
ILFree(pidlCommonStartMenu);
ILFree(pidlUserStartMenu);
return hr;
hr = pasf->QueryInterface(IID_PPV_ARG(IShellFolder, ppsfStartMenu));
pasf.Release();
-#endif
ILFree(pidlCommonStartMenu);
ILFree(pidlUserStartMenu);
HRESULT WINAPI
CStartMenu_Constructor(REFIID riid, void **ppv)
{
- IShellMenu* pShellMenu;
- IBandSite* pBandSite;
- IDeskBar* pDeskBar;
+ CComPtr<IShellMenu> pShellMenu;
+ CComPtr<IBandSite> pBandSite;
+ CComPtr<IDeskBar> pDeskBar;
HRESULT hr;
IShellFolder * psf;
+ LPITEMIDLIST pidlProgramsAbsolute;
LPITEMIDLIST pidlPrograms;
CComPtr<IShellFolder> psfPrograms;
+#if USE_SYSTEM_MENUBAND
+ hr = CoCreateInstance(CLSID_MenuBand,
+ NULL,
+ CLSCTX_INPROC_SERVER,
+ IID_PPV_ARG(IShellMenu, &pShellMenu));
+#else
hr = CMenuBand_Constructor(IID_PPV_ARG(IShellMenu, &pShellMenu));
+#endif
if (FAILED_UNEXPECTEDLY(hr))
return hr;
+#if USE_SYSTEM_MENUSITE
+ hr = CoCreateInstance(CLSID_MenuBandSite,
+ NULL,
+ CLSCTX_INPROC_SERVER,
+ IID_PPV_ARG(IBandSite, &pBandSite));
+#else
hr = CMenuSite_Constructor(IID_PPV_ARG(IBandSite, &pBandSite));
+#endif
if (FAILED_UNEXPECTEDLY(hr))
return hr;
+#if USE_SYSTEM_MENUDESKBAR
+ hr = CoCreateInstance(CLSID_MenuDeskBar,
+ NULL,
+ CLSCTX_INPROC_SERVER,
+ IID_PPV_ARG(IDeskBar, &pDeskBar));
+#else
hr = CMenuDeskBar_Constructor(IID_PPV_ARG(IDeskBar, &pDeskBar));
+#endif
if (FAILED_UNEXPECTEDLY(hr))
return hr;
if (FAILED_UNEXPECTEDLY(hr))
return hr;
- hr = psf->ParseDisplayName(NULL, NULL, L"Programs", NULL, &pidlPrograms, NULL);
+ hr = SHGetSpecialFolderLocation(NULL, CSIDL_PROGRAMS, &pidlProgramsAbsolute);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
+ pidlPrograms = ILClone(ILFindLastID(pidlProgramsAbsolute));
+ ILFree(pidlProgramsAbsolute);
+
hr = psf->BindToObject(pidlPrograms, NULL, IID_PPV_ARG(IShellFolder, &psfPrograms));
if (FAILED_UNEXPECTEDLY(hr))
return hr;