public static Pidl Create(Pidl pidl) { if (pidl == null) { return(null); } IntPtr pidlNew = IntPtr.Zero; LowLevelPidlWorks.Duplicate(pidl._pidl, out pidlNew); return(new Pidl(pidlNew)); }
private static void GetChildren(IntPtr pidl, bool getFolders, bool getFiles, ref Pidl[] _children) { NativeMethods.IShellFolder folder = null; if (LowLevelPidlWorks.GetSize(pidl) <= 2) { if (NativeMethods.SHGetDesktopFolder(out folder) != 0) { return; } } else { GetIShellFolderForPidl(pidl, out folder); } if (folder == null) { return; } try { NativeMethods.IEnumIDList enumIdList = null; ArrayList items = new ArrayList(); if (getFolders) { uint itemsToInclude = NativeMethods.SHCONTF_FOLDERS /* | WinApiProvider.SHCONTF.SHCONTF_INCLUDEHIDDEN*/; if (folder.EnumObjects(IntPtr.Zero, itemsToInclude, out enumIdList) == S_OK) { try { IntPtr newPidl = IntPtr.Zero; IntPtr fetched = IntPtr.Zero; enumIdList.Reset(); while (enumIdList.Next(1, out newPidl, out fetched) == 0) { IntPtr pidlConcat = IntPtr.Zero; LowLevelPidlWorks.Concatenate(pidl, newPidl, out pidlConcat); NativeMethods.CoTaskMemFree(newPidl); Pidl item = new Pidl(pidlConcat, PidlType.Folder); items.Add(item); newPidl = IntPtr.Zero; } } finally { Marshal.ReleaseComObject(enumIdList); } } } if (getFiles) { uint itemsToInclude = NativeMethods.SHCONTF_NONFOLDERS /*| WinApiProvider.SHCONTF.SHCONTF_INCLUDEHIDDEN | WinApiProvider.SHCONTF.SHCONTF_STORAGE*/; if (folder.EnumObjects(IntPtr.Zero, itemsToInclude, out enumIdList) == S_OK) { try { IntPtr newPidl = IntPtr.Zero; IntPtr fetched = IntPtr.Zero; enumIdList.Reset(); while (enumIdList.Next(1, out newPidl, out fetched) == 0) { IntPtr pidlConcat = IntPtr.Zero; LowLevelPidlWorks.Concatenate(pidl, newPidl, out pidlConcat); NativeMethods.CoTaskMemFree(newPidl); if (LowLevelPidlWorks.HasSuchAttributes(pidlConcat, NativeMethods.SFGAO_STREAM)) { Pidl item = new Pidl(pidlConcat, PidlType.File); items.Add(item); } else { NativeMethods.CoTaskMemFree(pidlConcat); } newPidl = IntPtr.Zero; } } finally { Marshal.ReleaseComObject(enumIdList); } } } _children = new Pidl[items.Count]; for (int i = 0; i < _children.Length; i++) { _children[i] = (Pidl)items[i]; } } finally { Marshal.ReleaseComObject(folder); } }
/// <summary> /// Internal Pidl object constructor. /// </summary> /// <param name="pidl">File or Folder PIDL.</param> private Pidl(IntPtr pidl) { this._pidl = pidl; this._type = LowLevelPidlWorks.IsStreamable(pidl) ? PidlType.File : PidlType.Folder; }