Для чего все это было написано?
Теперь мы без зазрений совести можем приступать к выводу нашего контекстного меню:
OleCheck (ShellFolder0.GetUIObjectOf (Handle,1,FItemIDList,IID_IContextMenu,nil,ICM)); Menu:=CreatePopupMenu; Try ICM.QueryContextMenu (Menu,1,$7FFF,CMF_EXPLORE or CMF_CANRENAME); Command:=TrackPopupMenu (Menu, TPM_LEFTALIGN or TPM_LEFTBUTTON or TPM_RETURNCMD, 100,100,0,Handle,nil);
If Command then Begin ICmd:=Longint (Command)-1; OleCheck (ICM.GetCommandString (ICmd,GCS_VERBA,nil,CommandStr,SizeOf (CommandStr))); CHandled:=False; DoCommandEvent (StrPas (CommandStr),CHandled); if not CHandled then begin FillChar (ICI,SizeOf (ICI),#0); ICI.cbSize:=SizeOf (ICI); ICI.hwnd:=Handle; ICI.lpVerb:=MakeIntResource (ICmd); ICI.nShow:=SW_SHOWNORMAL; OleCheck (ICM.InvokeCommand (ICI)); end; End; Finally ICM:=nil; End;
Что тут написано. Во-первых - вызов интерфейса IcontextMenu, сопряженного с объектом FItemIDList папки ShellFolder0. Во-вторых, создание дескриптора пустого контекстного меню; заполнение контекстного QueryContextMenu; использование команды TrackPopupMenu для вывода контекстного меню в точку (100, 100).