/* IClassFactory */ virtual HRESULT WINAPI CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObject) { *ppvObject = NULL; if (IsEqualCLSID(m_Clsid, CLSID_StartMenu)) return CStartMenu_Constructor(riid, ppvObject); if (IsEqualCLSID(m_Clsid, CLSID_MenuDeskBar)) return CMenuDeskBar_Constructor(riid, ppvObject); if (IsEqualCLSID(m_Clsid, CLSID_MenuBand)) return CMenuBand_Constructor(riid, ppvObject); if (IsEqualCLSID(m_Clsid, CLSID_MenuBandSite)) return CMenuSite_Constructor(riid, ppvObject); if (IsEqualCLSID(m_Clsid, CLSID_MergedFolder)) return CMergedFolder_Constructor(riid, ppvObject); if (IsEqualCLSID(m_Clsid, CLSID_RebarBandSite)) return CBandSite_Constructor(riid, ppvObject); return E_NOINTERFACE; }
HRESULT CMenuSFToolbar::InternalPopupItem(INT iItem, INT index, DWORD_PTR dwData, BOOL keyInitiated) { HRESULT hr; UINT uId; UINT uIdAncestor; DWORD flags; CComPtr<IShellMenuCallback> psmc; CComPtr<IShellMenu> shellMenu; LPITEMIDLIST pidl = reinterpret_cast<LPITEMIDLIST>(dwData); if (!pidl) return E_FAIL; hr = CMenuBand_Constructor(IID_PPV_ARG(IShellMenu, &shellMenu)); if (FAILED_UNEXPECTEDLY(hr)) return hr; m_menuBand->GetMenuInfo(&psmc, &uId, &uIdAncestor, &flags); // FIXME: not sure what to use as uId/uIdAncestor here hr = shellMenu->Initialize(psmc, 0, uId, SMINIT_VERTICAL); if (FAILED_UNEXPECTEDLY(hr)) return hr; CComPtr<IShellFolder> childFolder; hr = m_shellFolder->BindToObject(pidl, NULL, IID_PPV_ARG(IShellFolder, &childFolder)); if (FAILED_UNEXPECTEDLY(hr)) return hr; hr = shellMenu->SetShellFolder(childFolder, NULL, NULL, 0); if (FAILED_UNEXPECTEDLY(hr)) return hr; return PopupSubMenu(iItem, index, shellMenu, keyInitiated); }