//internal static string getParentParseName(PIDL pidl) //{ // PIDL relPIDL; // PIDL parentPIDL = getParentPIDL(pidl, out relPIDL); // IShellFolder sf = getParentIShellFolder(parentPIDL, out relPIDL); // if (relPIDL.Size == 0) // return IOTools.IID_Desktop; // return loadName(sf, relPIDL, ShellAPI.SHGNO.FORPARSING); //} internal static ShellFolder2 getParentIShellFolder(PIDL pidl, out PIDL relPIDL) { int hr; IntPtr ptrShellFolder = IntPtr.Zero; if (pidl.Size == 0 || PIDL.ILFindLastID(pidl.Ptr) == pidl.Ptr || //is root or parent is root PIDLToPath(pidl) == Environment.GetFolderPath(Environment.SpecialFolder.Desktop)) { hr = ShellAPI.SHGetDesktopFolder(out ptrShellFolder); relPIDL = new PIDL(pidl, true); } else { PIDL parentPIDL = getParentPIDL(pidl, out relPIDL); //Console.WriteLine("ParentPIDL.Size = {0}", parentPIDL.Size); Guid guid = ShellAPI.IID_IShellFolder2; using (ShellFolder2 _desktopShellFolder = getDesktopShellFolder()) hr = _desktopShellFolder.BindToObject(parentPIDL.Ptr, IntPtr.Zero, ref guid, out ptrShellFolder); if (parentPIDL != null) { parentPIDL.Free(); } } if (hr == ShellAPI.S_OK && ptrShellFolder != IntPtr.Zero) { return(new ShellFolder2(ptrShellFolder)); } Marshal.ThrowExceptionForHR(hr); return(null); //mute error. }
internal static PIDL getRelativePIDL(PIDL pidl) { if (pidl == null) { return(null); } IntPtr pRelPIDL = PIDL.ILFindLastID(pidl.Ptr); if (pRelPIDL == IntPtr.Zero) { throw new IOException("getRelativePIDL"); } return(new PIDL(pRelPIDL, true)); //0.21 }