ShellItem[] ParseShellIDListArray(ComTypes.IDataObject pDataObj) { List<ShellItem> result = new List<ShellItem>(); ComTypes.FORMATETC format = new ComTypes.FORMATETC(); ComTypes.STGMEDIUM medium = new ComTypes.STGMEDIUM(); format.cfFormat = (short)User32.RegisterClipboardFormat("Shell IDList Array"); format.dwAspect = ComTypes.DVASPECT.DVASPECT_CONTENT; format.lindex = 0; format.ptd = IntPtr.Zero; format.tymed = ComTypes.TYMED.TYMED_HGLOBAL; pDataObj.GetData(ref format, out medium); Kernel32.GlobalLock(medium.unionmember); try { ShellItem parentFolder = null; int count = Marshal.ReadInt32(medium.unionmember); int offset = 4; for (int n = 0; n <= count; ++n) { int pidlOffset = Marshal.ReadInt32(medium.unionmember, offset); int pidlAddress = (int)medium.unionmember + pidlOffset; if (n == 0) { parentFolder = new ShellItem(new IntPtr(pidlAddress)); } else { result.Add(new ShellItem(parentFolder, new IntPtr(pidlAddress))); } offset += 4; } } finally { Marshal.FreeHGlobal(medium.unionmember); } return result.ToArray(); }