// Microsoft Windows // Copyright (C) Microsoft Corporation, 1995 - 1995. // File: menusp.cxx // Contents: Implementation of IContextMenu // History: 20-Dec-95 BruceFo Created #include "headers.hxx" #pragma hdrstop #include "util.hxx" #include "dutil.hxx" #include "menusp.hxx" #include "menuutil.hxx" #include "shares.h" #include "resource.h" #ifdef WIZARDS CSharesCMSpecial::CSharesCMSpecial( IN HWND hwnd ) : m_ulRefs(0), m_hwnd(hwnd), m_pidl(NULL), m_psf(NULL) { AddRef(); } HRESULT CSharesCMSpecial::InitInstance( IN PWSTR pszMachine, IN LPCITEMIDLIST pidl, IN IShellFolder* psf ) { m_pszMachine = pszMachine; m_pidl = ILClone(pidl); if (NULL == m_pidl) { return E_OUTOFMEMORY; } m_psf = psf; m_psf->AddRef(); return S_OK; } CSharesCMSpecial::~CSharesCMSpecial() { ILFree(m_pidl); m_pidl = NULL; m_psf->Release(); m_psf = NULL; } STDMETHODIMP CSharesCMSpecial::QueryContextMenu( HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags ) { UINT idMerge; if (uFlags & CMF_DVFILE) { idMerge = POPUP_SPECIAL_FILE; } else { idMerge = POPUP_SPECIAL; } QCMINFO qcm = { hmenu, indexMenu, idCmdFirst, idCmdLast }; MyMergeMenu(g_hInstance, idMerge, 0, &qcm); SetMenuDefaultItem(hmenu, idCmdFirst + FSIDM_OPENSPECIAL, FALSE); return ResultFromShort(qcm.idCmdFirst - idCmdFirst); } STDMETHODIMP CSharesCMSpecial::InvokeCommand( LPCMINVOKECOMMANDINFO lpici ) { HRESULT hr = S_OK; LPIDSHARE pids; UINT i; UINT idCmd = (UINT)LOWORD((DWORD)lpici->lpVerb); if (HIWORD(lpici->lpVerb)) { // Deal with string commands PSTR pszCmd = (PSTR)lpici->lpVerb; // Check for "link" that comes from the toolbar or the shell view. if (0 == lstrcmpA(pszCmd, "link")) { idCmd = SHARED_FILE_LINK; } else { return E_INVALIDARG; } } switch(idCmd) { case FSIDM_OPENSPECIAL: { pids = (LPIDSHARE)m_pidl; hr = ShareDoSpecial(m_hwnd, m_pszMachine, Share_GetFlags(pids)); CHECK_HRESULT(hr); break; } case SHARED_FILE_LINK: { UINT dwfInOut = 0; IDataObject* pDataObject; hr = m_psf->GetUIObjectOf( lpici->hwnd, 1, (LPCITEMIDLIST*)&m_pidl, IID_IDataObject, &dwfInOut, (LPVOID*)&pDataObject); if (SUCCEEDED(hr)) { SHCreateLinks( lpici->hwnd, NULL, pDataObject, SHCL_USETEMPLATE, NULL); pDataObject->Release(); } break; } } // switch(wParam) return hr; } STDMETHODIMP CSharesCMSpecial::GetCommandString( UINT_PTR idCmd, UINT uType, UINT * pwReserved, LPSTR pszName, UINT cchMax ) { *((LPWSTR)pszName) = TEXT('\0'); if (uType == GCS_HELPTEXT) { LoadStringW(g_hInstance, idCmd + IDS_MH_FSIDM_FIRST, (LPWSTR)pszName, cchMax); return NOERROR; } return E_FAIL; } #endif // WIZARDS