* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include <precomp.h>
+#include "precomp.h"
/*
* Start menu button context menu
hRet = IShellFolder_GetUIObjectOf(psf,
hWndOwner,
1,
- (LPCITEMIDLIST*)&pidl, /* FIXME: shouldn't need a typecast! */
+ (LPCITEMIDLIST *)&pidl,
&IID_IContextMenu,
NULL,
- (PVOID*)&pcm);
+ (PVOID *)&pcm);
if (SUCCEEDED(hRet))
{
hPopup = CreatePopupMenu();
return hPopup;
}
- IContextMenu_Release(pcm);
DestroyMenu(hPopup);
}
+
+ IContextMenu_Release(pcm);
}
return NULL;
IN PVOID pcmContext OPTIONAL,
IN PVOID Context OPTIONAL)
{
- PSTARTMNU_CTMENU_CTX psmcmc = (PSTARTMNU_CTMENU_CTX)pcmContext;
+ PSTARTMNU_CTMENU_CTX psmcmc = pcmContext;
if (uiCmdId != 0)
{
hRet = IShellFolder_BindToObject(psfDesktop,
pidlStart,
NULL,
- (REFIID)&IID_IShellFolder, /* FIXME: Shouldn't require a typecast */
+ &IID_IShellFolder,
(PVOID*)&psfStart);
if (SUCCEEDED(hRet))
{
AddStartContextMenuItems(hWndOwner,
hPopup);
- *((PSTARTMNU_CTMENU_CTX*)ppcmContext) = psmcmc;
+ *ppcmContext = psmcmc;
return hPopup;
}
else
TEXT("Advanced"),
TEXT("StartMenuLogoff")));
- /* FIXME: Favorites */
+ /* Favorites */
+ if (!GetExplorerRegValueSet(HKEY_CURRENT_USER,
+ TEXT("Advanced"),
+ TEXT("StartMenuFavorites")))
+ {
+ DeleteMenu(hMenu,
+ IDM_FAVORITES,
+ MF_BYCOMMAND);
+ }
/* Documents */
if (SHRestricted(REST_NORECENTDOCSMENU))
IStartMenuSiteImpl *This;
This = HeapAlloc(hProcessHeap,
- 0,
+ HEAP_ZERO_MEMORY,
sizeof(*This));
if (This == NULL)
return NULL;
- ZeroMemory(This,
- sizeof(*This));
-
This->lpVtbl = &IStartMenuSiteImpl_Vtbl;
This->lpServiceProviderVtbl = &IServiceProviderImpl_Vtbl;
This->lpStartMenuCallbackVtbl = &ITrayPrivImpl_Vtbl;
hRet = IMenuPopup_QueryInterface(pMenuPopup,
&IID_IBanneredBar,
- (PVOID)&pbb);
+ (PVOID *)&pbb);
if (SUCCEEDED(hRet))
{
- // hRet = IBanneredBar_SetBitmap(pbb,
- // hbmBanner);
- hRet = pbb->lpVtbl->SetBitmap(pbb,
- hbmBanner);
-
+ hRet = IBanneredBar_SetBitmap(pbb, hbmBanner);
/* Update the icon size */
- //hRet = IBanneredBar_SetIconSize(pbb,
- // bSmallIcons ? BMICON_SMALL : BMICON_LARGE);
- hRet = pbb->lpVtbl->SetIconSize(pbb,
+ hRet = IBanneredBar_SetIconSize(pbb,
bSmallIcons ? BMICON_SMALL : BMICON_LARGE);
- //IBanneredBar_Release(pbb);
- pbb->lpVtbl->Release(pbb);
+ IBanneredBar_Release(pbb);
}
return hRet;
}
-IMenuPopup*
+IMenuPopup *
CreateStartMenu(IN ITrayWindow *Tray,
OUT IMenuBand **ppMenuBand,
IN HBITMAP hbmBanner OPTIONAL,
IN BOOL bSmallIcons)
{
- HRESULT hRet;
+ HRESULT hr;
IObjectWithSite *pOws = NULL;
IMenuPopup *pMp = NULL;
IStartMenuSite *pSms = NULL;
IMenuBand *pMb = NULL;
IInitializeObject *pIo;
- IUnknown *pUnk;
- IBandSite *pBs;
+ IUnknown *pUnk = NULL;
+ IBandSite *pBs = NULL;
DWORD dwBandId = 0;
pSms = CreateStartMenuSite(Tray);
if (pSms == NULL)
return NULL;
- hRet = CoCreateInstance(&CLSID_StartMenu,
- NULL,
- CLSCTX_INPROC_SERVER,
- &IID_IMenuPopup,
- (PVOID*)&pMp);
- if (SUCCEEDED(hRet))
+#if 0
+ hr = CoCreateInstance(&CLSID_StartMenu,
+ NULL,
+ CLSCTX_INPROC_SERVER,
+ &IID_IMenuPopup,
+ (PVOID *)&pMp);
+#else
+ hr = CStartMenu_Constructor(&IID_IMenuPopup,(PVOID *)&pMp);
+#endif
+ if (FAILED(hr))
{
- hRet = IMenuPopup_QueryInterface(pMp,
- &IID_IObjectWithSite,
- (PVOID*)&pOws);
- if (SUCCEEDED(hRet))
- {
- /* Set the menu site so we can handle messages */
- hRet = IObjectWithSite_SetSite(pOws,
- (IUnknown*)pSms);
- if (SUCCEEDED(hRet))
- {
- /* Initialize the menu object */
- hRet = IMenuPopup_QueryInterface(pMp,
- &IID_IInitializeObject,
- (PVOID*)&pIo);
- if (SUCCEEDED(hRet))
- {
- //hRet = IInitializeObject_Initialize(pIo);
- hRet = pIo->lpVtbl->Initialize(pIo);
-
- //IInitializeObject_Release(pIo);
- pIo->lpVtbl->Release(pIo);
- }
- else
- hRet = S_OK;
-
- /* Everything is initialized now. Let's get the IMenuBand interface. */
- if (SUCCEEDED(hRet))
- {
- hRet = IMenuPopup_GetClient(pMp,
- &pUnk);
-
- if (SUCCEEDED(hRet))
- {
- hRet = IUnknown_QueryInterface(pUnk,
- &IID_IBandSite,
- (PVOID*)&pBs);
+ DbgPrint("CoCreateInstance failed: %x\n", hr);
+ goto cleanup;
+ }
- if (SUCCEEDED(hRet))
- {
- /* Finally we have the IBandSite interface, there's only one
- band in it that apparently provides the IMenuBand interface */
- hRet = IBandSite_EnumBands(pBs,
- 0,
- &dwBandId);
- if (SUCCEEDED(hRet))
- {
- hRet = IBandSite_GetBandObject(pBs,
- dwBandId,
- &IID_IMenuBand,
- (PVOID*)&pMb);
- }
-
- IBandSite_Release(pBs);
- }
+ hr = IMenuPopup_QueryInterface(pMp,
+ &IID_IObjectWithSite,
+ (PVOID *)&pOws);
+ if (FAILED(hr))
+ {
+ DbgPrint("IMenuPopup_QueryInterface failed: %x\n", hr);
+ goto cleanup;
+ }
- IUnknown_Release(pUnk);
- }
- }
- }
+ /* Set the menu site so we can handle messages */
+ hr = IObjectWithSite_SetSite(pOws, (IUnknown *)pSms);
+ if (FAILED(hr))
+ {
+ DbgPrint("IObjectWithSite_SetSite failed: %x\n", hr);
+ goto cleanup;
+ }
- IObjectWithSite_Release(pOws);
- }
+ /* Initialize the menu object */
+ hr = IMenuPopup_QueryInterface(pMp, &IID_IInitializeObject, (PVOID*)&pIo);
+ if (SUCCEEDED(hr))
+ {
+ hr = IInitializeObject_Initialize(pIo);
+ IInitializeObject_Release(pIo);
}
+ else
+ hr = S_OK;
- IStartMenuSite_Release(pSms);
+ /* Everything is initialized now. Let's get the IMenuBand interface. */
+ if (FAILED(hr))
+ {
+ DbgPrint("IMenuPopup_QueryInterface failed: %x\n", hr);
+ goto cleanup;
+ }
- if (!SUCCEEDED(hRet))
+ hr = IMenuPopup_GetClient(pMp, &pUnk);
+ if (FAILED(hr))
{
- DbgPrint("Failed to initialize the start menu: 0x%x!\n", hRet);
+ DbgPrint("IMenuPopup_GetClient failed: %x\n", hr);
+ goto cleanup;
+ }
- if (pMp != NULL)
- IMenuPopup_Release(pMp);
+ hr = IUnknown_QueryInterface(pUnk, &IID_IBandSite, (PVOID *)&pBs);
+ if (FAILED(hr))
+ {
+ DbgPrint("IUnknown_QueryInterface pBs failed: %x\n", hr);
+ goto cleanup;
+ }
- if (pMb != NULL)
- IMenuBand_Release(pMb);
+ /* Finally we have the IBandSite interface, there's only one
+ band in it that apparently provides the IMenuBand interface */
+ hr = IBandSite_EnumBands(pBs, 0, &dwBandId);
+ if (FAILED(hr))
+ {
+ DbgPrint("IBandSite_EnumBands failed: %x\n", hr);
+ goto cleanup;
+ }
- return NULL;
+ hr = IBandSite_GetBandObject(pBs, dwBandId, &IID_IMenuBand, (PVOID *)&pMb);
+ if (FAILED(hr))
+ {
+ DbgPrint("IBandSite_GetBandObject failed: %x\n", hr);
+ goto cleanup;
}
UpdateStartMenu(pMp,
hbmBanner,
bSmallIcons);
- *ppMenuBand = pMb;
+cleanup:
+ if (SUCCEEDED(hr))
+ *ppMenuBand = pMb;
+ else if (pMb != NULL)
+ IMenuBand_Release(pMb);
+
+ if (pBs != NULL)
+ IBandSite_Release(pBs);
+ if (pUnk != NULL)
+ IUnknown_Release(pUnk);
+ if (pOws != NULL)
+ IObjectWithSite_Release(pOws);
+ if (pMp != NULL)
+ IMenuPopup_Release(pMp);
+ if (pSms != NULL)
+ IStartMenuSite_Release(pSms);
+
+ if (FAILED(hr))
+ return NULL;
return pMp;
}