private static IEnumerable <string> GetFolders(ModernShell.IShellItem shellItem) { var id = new Guid(ModernShell.InterfaceGuids.IShellItemArray); var shellLibrary = (ModernShell.IShellLibrary) new ModernShell.ShellLibrary(); var shellItems = default(ModernShell.IShellItemArray); try { shellLibrary.LoadLibraryFromItem(shellItem, ModernShell.AccessModes.Read); try { var result = shellLibrary.GetFolders(ModernShell.LibraryFolderFilter.AllItems, ref id, out shellItems); if (result == ModernShell.HResult.S_OK) { foreach (var folder in GetFolders(shellItems)) { yield return(folder); } } } finally { Marshal.ReleaseComObject(shellItems); } } finally { Marshal.ReleaseComObject(shellLibrary); } }
private static string GetDisplayName(ModernShell.IShellItem shellItem, ModernShell.SIGDN sigdn) { var pointer = shellItem.GetDisplayName(sigdn); var result = Marshal.PtrToStringUni(pointer); Marshal.FreeCoTaskMem(pointer); return(result); }