Пример #1
0
        private Uri GetShellUri(IntPtr pidl, bool free)
        {
            Stack <string> list;
            IntPtr         pidlrel = free ? pidl : Shell32.ILClone(pidl);

            try{
                list = new Stack <string>();

                while (true)
                {
                    string name = Shell32.SHGetNameFromIDList(pidlrel, SIGDN.SIGDN_PARENTRELATIVEPARSING);
                    if (!Shell32.ILRemoveLastID(pidlrel))
                    {
                        break;                                                      //TODO check if really desktop
                    }
                    list.Push(name);
                }
            }finally{
                Marshal.FreeCoTaskMem(pidlrel);
            }

            string path = String.Join("/", list.Select(n => HttpUtility.UrlEncode(n)));

            return(GetShellUri(path));
        }
Пример #2
0
        private ShellItemImpl GetParent()
        {
            var pidl = Shell32.ILClone(Pidl);

            if (Shell32.ILRemoveLastID(pidl))
            {
                return(new ShellItemImpl(pidl, true));
            }
            return(this);
        }
Пример #3
0
 public ShellItemImpl(IntPtr pidl, bool owner)
 {
     if (owner)
     {
         Pidl = pidl;
     }
     else
     {
         Pidl = Shell32.ILClone(pidl);
     }
 }
Пример #4
0
        public HResult GetParent(out IShellItem ppsi)
        {
            var pidl = Shell32.ILClone(Pidl);

            if (Shell32.ILRemoveLastID(pidl))
            {
                ppsi = new ShellItemImpl(pidl, true);
                return(HResult.S_OK);
            }
            ppsi = null;
            return(HResult.MK_E_NOOBJECT);
        }
Пример #5
0
        public static IShellFolder GetFolderImpl(this IntPtr pidl,
                                                 ref PidlFolderData data, SBSP wFlags)
        {
            IShellFolder result = null;

            int    hr                  = 0;
            IntPtr pidlTmp             = IntPtr.Zero;
            var    folderTmp           = data.folderTmp;
            var    currentAbsolutePidl = data.currentAbsolutePidl;
            var    folderTmpPtr        = data.folderTmpPtr;
            var    currentFolder       = data.currentFolder;

            IShellFolder desktopFolder     = PidlFolderData.DesktopFolder;
            var          desktopFolderPidl = PidlFolderData.DesktopFolderPidl;

            //  Check to see if we have a desktop pidl, relative pidl or absolite pidl.
            if (Shell32.ILIsEqual(pidl, desktopFolderPidl))
            {
                //  The provided PIDL is the desktop folder.
                pidlTmp   = Shell32.ILClone(desktopFolderPidl);
                folderTmp = desktopFolder;
            }
            else if ((wFlags & SBSP.SBSP_RELATIVE) != 0)
            {
                // SBSP_RELATIVE - pidl is relative from the current folder
                if ((hr = currentFolder.BindToObject(pidl, IntPtr.Zero,
                                                     ref Shell32.IID_IShellFolder,
                                                     out folderTmpPtr)) != WinError.S_OK)
                {
                    return(result); // hr;
                }
                pidlTmp = Shell32.ILCombine(currentAbsolutePidl, pidl);

                folderTmp = (IShellFolder)Marshal.GetObjectForIUnknown(folderTmpPtr);
            }
            else
            {
                // SBSP_ABSOLUTE - pidl is an absolute pidl (relative from desktop)
                PidlClone pidlClone = PidlClone.Of(pidl);
                folderTmp = GetPidlCloneFolder(pidlClone);

                pidlTmp = pidlClone.Handle;
            }

            if (folderTmp == null)
            {
                Shell32.ILFree(pidlTmp);
                return(result); // WinError.E_FAIL;
            }

            result = folderTmp;
            return(result);
        }
Пример #6
0
        ShellItemImpl GetParent()
        {
            IntPtr pidl = Shell32.ILClone(m_Pidl);

            if (Shell32.ILRemoveLastID(pidl))
            {
                return(new ShellItemImpl(pidl, true));
            }
            else
            {
                return(this);
            }
        }
Пример #7
0
        IShellFolder IFolder(IntPtr pidl, IShellFolder pShellFolderInterface, ref int result)
        {
            if (Shell32.ILIsEqual(pidl, Desktop.PIDL))
            {
                result = WinError.S_OK;
                return((IShellFolder)Desktop.ShellFolderInterface);
            }

            IntPtr ppv = IntPtr.Zero;

            result = pShellFolderInterface.BindToObject(pidl, IntPtr.Zero,
                                                        ref Shell32.IID_IShellFolder,
                                                        out ppv);

            if (ppv == IntPtr.Zero)
            {
                // SBSP_ABSOLUTE - pidl is an absolute pidl (relative from desktop)
                var          pidlTmp       = Shell32.ILClone(pidl);
                IntPtr       folderTmpPtr  = IntPtr.Zero;
                IShellFolder desktopFolder = NativePidl.DesktopFolder;
                var          hr            = desktopFolder.BindToObject(pidlTmp, IntPtr.Zero,
                                                                        ref Shell32.IID_IShellFolder,
                                                                        out folderTmpPtr);
                if (hr != WinError.S_OK)
                {
                    return(null);
                }

                var folderTmp = Marshal.GetObjectForIUnknown(folderTmpPtr) as IShellFolder;

                if (folderTmp == null)
                {
                    Shell32.ILFree(pidlTmp);
                    return(null);; // WinError.E_FAIL
                }

                return(folderTmp);
            }

            var shellFolderInterface = Marshal.GetObjectForIUnknown(ppv) as IShellFolder;

            return(shellFolderInterface);
        }
Пример #8
0
 private ShellFileHandle(IntPtr pidl, ShellFileSystem fs, bool own) : base(fs)
 {
     this.pidl = own ? pidl : Shell32.ILClone(pidl);
     this.fs   = fs;
 }
        int IShellBrowser.BrowseObject(IntPtr pidl, SBSP wFlags)
        {
            if (this.InvokeRequired)
            {
                AutoResetEvent theEvent = new AutoResetEvent(false);
                int            result   = WinError.E_FAIL;
                this.Invoke((Action)(() =>
                {
                    result = ((IShellBrowser)this).BrowseObject(pidl, wFlags);
                    theEvent.Set();
                }));
                theEvent.WaitOne();
                return(result);
            }

            int          hr;
            IntPtr       folderTmpPtr;
            IShellFolder folderTmp;
            IntPtr       pidlTmp;

            //  We'll need the shell folder GUID.
            var shellFolderGuid = typeof(IShellFolder).GUID;
            var shellViewGuid   = typeof(IShellView).GUID;

            //  Check to see if we have a desktop pidl, relative pidl or absolite pidl.
            if (Shell32.ILIsEqual(pidl, desktopFolderPidl))
            {
                //  The provided PIDL is the desktop folder.
                pidlTmp   = Shell32.ILClone(desktopFolderPidl);
                folderTmp = desktopFolder;
            }
            else if ((wFlags & SBSP.SBSP_RELATIVE) != 0)
            {
                // SBSP_RELATIVE - pidl is relative from the current folder
                if ((hr = currentFolder.BindToObject(pidl, IntPtr.Zero,
                                                     ref shellFolderGuid,
                                                     out folderTmpPtr)) != WinError.S_OK)
                {
                    return(hr);
                }
                pidlTmp   = Shell32.ILCombine(currentAbsolutePidl, pidl);
                folderTmp = (IShellFolder)Marshal.GetObjectForIUnknown(folderTmpPtr);
            }
            else
            {
                // SBSP_ABSOLUTE - pidl is an absolute pidl (relative from desktop)
                pidlTmp = Shell32.ILClone(pidl);
                if ((hr = desktopFolder.BindToObject(pidlTmp, IntPtr.Zero,
                                                     ref shellFolderGuid,
                                                     out folderTmpPtr)) != WinError.S_OK)
                {
                    return(hr);
                }
                folderTmp = (IShellFolder)Marshal.GetObjectForIUnknown(folderTmpPtr);
            }

            if (folderTmp == null)
            {
                Shell32.ILFree(pidlTmp);
                return(WinError.E_FAIL);
            }

            // Check that we have a new pidl
            if (Shell32.ILIsEqual(pidlTmp, currentAbsolutePidl))
            {
                Shell32.ILFree(pidlTmp);
                return(WinError.S_OK);
            }

            currentFolder = folderTmp;

            FOLDERSETTINGS fs             = new FOLDERSETTINGS();
            IShellView     lastIShellView = shellView;

            if (lastIShellView != null)
            {
                lastIShellView.GetCurrentInfo(ref fs);
            }
            // Copy the old folder settings
            else
            {
                fs          = new FOLDERSETTINGS();
                fs.fFlags   = folderFlags;
                fs.ViewMode = folderViewMode;
            }

            // Create the IShellView
            IntPtr iShellViewPtr;

            hr = folderTmp.CreateViewObject(Handle,
                                            ref shellViewGuid, out iShellViewPtr);
            if (hr == WinError.S_OK)
            {
                shellView = (IShellView)
                            Marshal.GetObjectForIUnknown(iShellViewPtr);

                hWndListView = IntPtr.Zero;
                RECT rc =
                    new RECT(0, 0,
                             ClientSize.Width,
                             ClientSize.Height);

                int res;

                try
                {
                    // Create the actual list view.
                    res = shellView.CreateViewWindow(lastIShellView, ref fs,
                                                     this, ref rc, ref hWndListView);
                }
                catch (COMException)
                {
                    return(WinError.E_FAIL);
                }

                if (res < 0)
                {
                    return(WinError.E_FAIL);
                }

                // Release the old IShellView
                if (lastIShellView != null)
                {
                    lastIShellView.GetCurrentInfo(ref fs);
                    lastIShellView.UIActivate(SVUIA_STATUS.SVUIA_DEACTIVATE);
                    lastIShellView.DestroyViewWindow();
                }

                // Set focus to the IShellView
                shellView.UIActivate(SVUIA_STATUS.SVUIA_ACTIVATE_FOCUS);
                currentAbsolutePidl = pidlTmp;
            }

            return(WinError.S_OK);
        }
Пример #10
0
 public ShellItemImpl(IntPtr pidl, bool owner)
 {
     Pidl = owner ? pidl : Shell32.ILClone(pidl);
 }
Пример #11
0
        private ShellItemImpl GetParent()
        {
            IntPtr pidl = Shell32.ILClone(Pidl);

            return(Shell32.ILRemoveLastID(pidl) ? new ShellItemImpl(pidl, true) : this);
        }
Пример #12
0
        public static int BrowseObject(this ShellDebuggerModel model, IntPtr pidl, SBSP wFlags)
        {
            int          hr;
            IntPtr       folderTmpPtr;
            IShellFolder folderTmp = null;
            IntPtr       pidlTmp;

            //  We'll need the shell folder GUID.
            var shellFolderGuid     = typeof(IShellFolder).GUID;
            var desktopFolder       = model.DesktopFolder;
            var currentFolder       = model.currentFolder;
            var currentAbsolutePidl = model.currentAbsolutePidl;

            //  Check to see if we have a desktop pidl, relative pidl or absolite pidl.
            if (Shell32.ILIsEqual(pidl, model.DesktopFolderPidl))
            {
                //  The provided PIDL is the desktop folder.
                pidlTmp   = Shell32.ILClone(model.DesktopFolderPidl);
                folderTmp = model.DesktopFolder;
            }
            else if ((wFlags & SBSP.SBSP_RELATIVE) != 0)
            {
                // SBSP_RELATIVE - pidl is relative from the current folder
                if ((hr = currentFolder.BindToObject(pidl, IntPtr.Zero,
                                                     shellFolderGuid,
                                                     out folderTmpPtr)) != WinError.S_OK)
                {
                    return(WinError.E_FAIL);
                }

                pidlTmp = Shell32.ILCombine(currentAbsolutePidl, pidl);

                folderTmp = (IShellFolder)Marshal.GetObjectForIUnknown(folderTmpPtr);
            }
            else
            {
                // SBSP_ABSOLUTE - pidl is an absolute pidl (relative from desktop)
                pidlTmp = Shell32.ILClone(pidl);
                if ((hr = desktopFolder.BindToObject(pidlTmp, IntPtr.Zero,
                                                     shellFolderGuid,
                                                     out folderTmpPtr)) != WinError.S_OK)
                {
                    return(WinError.E_FAIL);
                }

                folderTmp = (IShellFolder)Marshal.GetObjectForIUnknown(folderTmpPtr);
            }

            if (folderTmp == null)
            {
                Shell32.ILFree(pidlTmp);
                return(WinError.E_FAIL);
            }

            // Check that we have a new pidl
            if (Shell32.ILIsEqual(pidlTmp, currentAbsolutePidl))
            {
                Shell32.ILFree(pidlTmp);
                return(WinError.S_OK);
            }

            model.hWndListView = IntPtr.Zero;
            model.lastViewPidl = IntPtr.Zero;

            var ret = ChangeFolder(model, pidl, wFlags, folderTmp, pidlTmp);

            //var path = PidlManager.GetPidlDisplayName(pidlTmp);
            //if (path == "Control Panel" || model.lastViewPidl == IntPtr.Zero)
            //{
            //    IEnumIDList ppenumIDList = null;
            //    var hr3 = folderTmp.EnumObjects(model.Form.Handle,
            //        SHCONTF.SHCONTF_INCLUDEHIDDEN | SHCONTF.SHCONTF_INCLUDESUPERHIDDEN | SHCONTF.SHCONTF_NONFOLDERS, // | SHCONTF.SHCONTF_FOLDERS ,
            //        out ppenumIDList);

            //    if (ppenumIDList == null)       // if empty list
            //    {
            //        IntPtr iShellFolderPtr = IntPtr.Zero;
            //        var guidFolder2 = typeof(IShellFolder2).GUID;
            //        folderTmpPtr = IntPtr.Zero;

            //        if ((hr = desktopFolder.BindToObject(pidlTmp, IntPtr.Zero,
            //            ref guidFolder2, // shellFolderGuid,
            //            out folderTmpPtr)) == WinError.S_OK)
            //        {
            //            folderTmp = (IShellFolder2)Marshal.GetObjectForIUnknown(folderTmpPtr);

            //            var hr2 = ShellObject.CreateViewObject(folderTmp, model.Form.Handle, ref guidFolder2, out iShellFolderPtr);
            //        }

            //        if (iShellFolderPtr != IntPtr.Zero)
            //        {
            //            var ShellFolder = (IShellFolder2)
            //                           Marshal.GetObjectForIUnknown(iShellFolderPtr);
            //        }
            //    }
            //}

            return(ret == WinError.S_OK ? WinError.S_OK : WinError.E_FAIL);
        }
Пример #13
0
        public static PidlClone Of(IntPtr pidl)
        {
            IntPtr clone = Shell32.ILClone(pidl);

            return(new PidlClone(clone));
        }