Ejemplo n.º 1
0
        //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.
        }
Ejemplo n.º 2
0
        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
        }