예제 #1
0
        public static bool GetShellFolder(IntPtr pIDLFolder, out IShellFolder shellFolder)
        {
            shellFolder = null;
            if (PInvoke.ILGetSize(pIDLFolder) == 2)
            {
                return(0 == PInvoke.SHGetDesktopFolder(out shellFolder));
            }
            IShellFolder ppshf = null;
            Guid         riid  = ExplorerGUIDs.IID_IShellFolder;

            try {
                if (PInvoke.SHGetDesktopFolder(out ppshf) == 0)
                {
                    return(0 == ppshf.BindToObject(pIDLFolder, IntPtr.Zero, ref riid, out shellFolder));
                }
            }
            catch {
            }
            finally {
                if (ppshf != null)
                {
                    Marshal.ReleaseComObject(ppshf);
                }
            }
            return(false);
        }
예제 #2
0
        public static DragDropEffects DoDragDrop(List <string> lstPaths, Control control, bool fSameDirecotry)
        {
            DragDropEffects none;

            if ((lstPaths == null) || (lstPaths.Count == 0))
            {
                return(DragDropEffects.None);
            }
            IShellFolder  ppv  = null;
            object        obj2 = null;
            List <IntPtr> list = new List <IntPtr>();

            try {
                IntPtr[] ptrArray;
                if (fSameDirecotry)
                {
                    IntPtr ptr2;
                    IntPtr item = PInvoke.ILCreateFromPath(lstPaths[0]);
                    list.Add(item);
                    if ((PInvoke.SHBindToParent(item, ExplorerGUIDs.IID_IShellFolder, out ppv, out ptr2) != 0) || (ppv == null))
                    {
                        return(DragDropEffects.None);
                    }
                    List <IntPtr> list2 = new List <IntPtr>();
                    if (ptr2 != IntPtr.Zero)
                    {
                        list2.Add(ptr2);
                    }
                    for (int i = 1; i < lstPaths.Count; i++)
                    {
                        IntPtr ptr3 = PInvoke.ILCreateFromPath(lstPaths[i]);
                        if (ptr3 != IntPtr.Zero)
                        {
                            list.Add(ptr3);
                            IntPtr ptr4 = PInvoke.ILFindLastID(ptr3);
                            if (ptr4 != IntPtr.Zero)
                            {
                                list2.Add(ptr4);
                            }
                        }
                    }
                    if (list2.Count == 0)
                    {
                        return(DragDropEffects.None);
                    }
                    ptrArray = list2.ToArray();
                }
                else
                {
                    list.AddRange(lstPaths.Select(PInvoke.ILCreateFromPath).Where(ptr5 => ptr5 != IntPtr.Zero));
                    PInvoke.SHGetDesktopFolder(out ppv);
                    if ((list.Count == 0) || (ppv == null))
                    {
                        return(DragDropEffects.None);
                    }
                    ptrArray = list.ToArray();
                }
                uint rgfReserved = 0;
                Guid riid        = ExplorerGUIDs.IID_IDataObject;
                ppv.GetUIObjectOf(IntPtr.Zero, (uint)ptrArray.Length, ptrArray, ref riid, ref rgfReserved, out obj2);
                if (obj2 != null)
                {
                    return(control.DoDragDrop(obj2, DragDropEffects.Link | DragDropEffects.Move | DragDropEffects.Copy));
                }
                none = DragDropEffects.None;
            }
            finally {
                if (obj2 != null)
                {
                    Marshal.ReleaseComObject(obj2);
                }
                if (ppv != null)
                {
                    Marshal.ReleaseComObject(ppv);
                }
                foreach (IntPtr ptr6 in list)
                {
                    if (ptr6 != IntPtr.Zero)
                    {
                        PInvoke.CoTaskMemFree(ptr6);
                    }
                }
            }
            return(none);
        }