11 int CShellMgr::GetIconIndex(LPITEMIDLIST lpi, UINT uFlags)
13 SHFILEINFO sfi = { 0 };
14 DWORD_PTR dwRet = ::SHGetFileInfo((LPCTSTR)lpi, 0, &sfi, sizeof(SHFILEINFO), uFlags);
15 return (dwRet != 0) ? sfi.iIcon : -1;
18 void CShellMgr::GetNormalAndSelectedIcons(LPITEMIDLIST lpifq, LPTVITEM lptvitem)
20 int nRet = lptvitem->iImage = GetIconIndex(lpifq, SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
22 nRet = lptvitem->iSelectedImage = GetIconIndex(lpifq, SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON | SHGFI_OPENICON);
26 LPITEMIDLIST CShellMgr::ConcatPidls(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
29 if (pidl1 != NULL) // May be NULL
30 cb1 = GetSize(pidl1) - sizeof(pidl1->mkid.cb);
32 UINT cb2 = GetSize(pidl2);
34 LPITEMIDLIST pidlNew = (LPITEMIDLIST)::CoTaskMemAlloc(cb1 + cb2);
38 memcpy(pidlNew, pidl1, cb1);
40 memcpy(((LPSTR)pidlNew) + cb1, pidl2, cb2);
46 BOOL CShellMgr::GetName(LPSHELLFOLDER lpsf, LPITEMIDLIST lpi, DWORD dwFlags, LPTSTR lpFriendlyName)
49 STRRET str = { STRRET_CSTR };
51 if (lpsf->GetDisplayNameOf(lpi, dwFlags, &str) == NOERROR)
58 lstrcpy(lpFriendlyName, W2CT(str.pOleStr));
59 ::CoTaskMemFree(str.pOleStr);
62 lstrcpy(lpFriendlyName, (LPTSTR)lpi + str.uOffset);
65 lstrcpy(lpFriendlyName, A2CT(str.cStr));
80 LPITEMIDLIST CShellMgr::Next(LPCITEMIDLIST pidl)
82 LPSTR lpMem = (LPSTR)pidl;
83 lpMem += pidl->mkid.cb;
84 return (LPITEMIDLIST)lpMem;
87 UINT CShellMgr::GetSize(LPCITEMIDLIST pidl)
92 cbTotal += sizeof(pidl->mkid.cb); // Null terminator
93 while (pidl->mkid.cb != NULL)
95 cbTotal += pidl->mkid.cb;
103 LPITEMIDLIST CShellMgr::CopyITEMID(LPITEMIDLIST lpi)
105 LPITEMIDLIST lpiTemp = (LPITEMIDLIST)::CoTaskMemAlloc(lpi->mkid.cb + sizeof(lpi->mkid.cb));
106 ::CopyMemory((PVOID)lpiTemp, (CONST VOID*)lpi, lpi->mkid.cb + sizeof(lpi->mkid.cb));
110 LPITEMIDLIST CShellMgr::GetFullyQualPidl(LPSHELLFOLDER lpsf, LPITEMIDLIST lpi)
112 TCHAR szBuff[MAX_PATH] = { 0 };
114 if (!GetName(lpsf, lpi, SHGDN_FORPARSING, szBuff))
117 CComPtr<IShellFolder> spDeskTop;
118 HRESULT hr = ::SHGetDesktopFolder(&spDeskTop);
123 LPITEMIDLIST lpifq = NULL;
126 hr = spDeskTop->ParseDisplayName(NULL, NULL, T2W(szBuff), &ulEaten, &lpifq, &ulAttribs);
134 BOOL CShellMgr::DoContextMenu(HWND hWnd, LPSHELLFOLDER lpsfParent, LPITEMIDLIST lpi, POINT point)
136 CComPtr<IContextMenu> spContextMenu;
137 HRESULT hr = lpsfParent->GetUIObjectOf(hWnd, 1, (const struct _ITEMIDLIST**)&lpi, IID_IContextMenu, 0, (LPVOID*)&spContextMenu);
141 HMENU hMenu = ::CreatePopupMenu();
145 // Get the context menu for the item.
146 hr = spContextMenu->QueryContextMenu(hMenu, 0, 1, 0x7FFF, CMF_EXPLORE);
150 int idCmd = ::TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_RETURNCMD | TPM_RIGHTBUTTON, point.x, point.y, 0, hWnd, NULL);
156 // Execute the command that was selected.
157 CMINVOKECOMMANDINFO cmi = { 0 };
158 cmi.cbSize = sizeof(CMINVOKECOMMANDINFO);
161 cmi.lpVerb = T2CA(MAKEINTRESOURCE(idCmd - 1));
162 cmi.lpParameters = NULL;
163 cmi.lpDirectory = NULL;
164 cmi.nShow = SW_SHOWNORMAL;
167 hr = spContextMenu->InvokeCommand(&cmi);
170 ::DestroyMenu(hMenu);