Beispiel #1
0
        int OleInterop.IDataObject.QueryGetData(OleInterop.FORMATETC[] pFormatetc)
        {
            if (null != oleData)
            {
                return(oleData.QueryGetData(pFormatetc));
            }

            if ((null == pFormatetc) || (1 != pFormatetc.Length))
            {
                throw new ArgumentException();
            }

            BclComTypes.FORMATETC bclFormat = StructConverter.OleFormatETC2Bcl(ref pFormatetc[0]);
            return(bclData.QueryGetData(ref bclFormat));
        }
        public static object GetDropDescription(this System.Runtime.InteropServices.ComTypes.IDataObject dataObject)
        {
            FORMATETC formatETC;

            FillFormatETC(DropDescriptionFormat, TYMED.TYMED_HGLOBAL, out formatETC);

            if (0 == dataObject.QueryGetData(ref formatETC))
            {
                STGMEDIUM medium;
                dataObject.GetData(ref formatETC, out medium);
                try
                {
                    return((DataObject.DropDescription)Marshal.PtrToStructure(medium.unionmember, typeof(BExplorer.Shell.DataObject.DropDescription)));
                }
                catch (AccessViolationException)
                {
                }
                finally
                {
                    ReleaseStgMedium(ref medium);
                }
            }

            return(null);
        }
        private object GetDataFromOleHGLOBAL(string format, DVASPECT aspect)
        {
            FORMATETC formatEtc = new FORMATETC();

            formatEtc.cfFormat = ClipboardFormats.GetFormat(format);
            formatEtc.dwAspect = aspect;
            formatEtc.lindex   = -1;
            formatEtc.tymed    = TYMED.TYMED_HGLOBAL;
            if (_wrapped.QueryGetData(ref formatEtc) == 0)
            {
                _wrapped.GetData(ref formatEtc, out STGMEDIUM medium);
                try
                {
                    if (medium.unionmember != IntPtr.Zero && medium.tymed == TYMED.TYMED_HGLOBAL)
                    {
                        if (format == DataFormats.Text)
                        {
                            return(ReadStringFromHGlobal(medium.unionmember));
                        }
                        if (format == DataFormats.FileNames)
                        {
                            return(ReadFileNamesFromHGlobal(medium.unionmember));
                        }

                        byte[] data = ReadBytesFromHGlobal(medium.unionmember);

                        if (IsSerializedObject(data))
                        {
                            using (var ms = new MemoryStream(data))
                            {
                                ms.Position = DataObject.SerializedObjectGUID.Length;
                                BinaryFormatter binaryFormatter = new BinaryFormatter();
                                return(binaryFormatter.Deserialize(ms));
                            }
                        }
                        return(data);
                    }
                }
                finally
                {
                    UnmanagedMethods.ReleaseStgMedium(ref medium);
                }
            }
            return(null);
        }
        public int DragEnter(System.Runtime.InteropServices.ComTypes.IDataObject pDataObj, int grfKeyState, BandObjectLib.POINT pt, ref DragDropEffects pdwEffect)
        {
            try {
                if (this.DragFileEnter != null)
                {
                    FORMATETC format = new FORMATETC();
                    format.cfFormat = 15;
                    format.ptd      = IntPtr.Zero;
                    format.dwAspect = DVASPECT.DVASPECT_CONTENT;
                    format.lindex   = -1;
                    format.tymed    = TYMED.TYMED_HGLOBAL;
                    if (pDataObj.QueryGetData(ref format) >= 0)
                    {
                        STGMEDIUM medium = new STGMEDIUM();
                        try {
                            try {
                                pDataObj.GetData(ref format, out medium);
                                pdwEffect = this.DragFileEnter(medium.unionmember, pt, grfKeyState);
                            }
                            catch {
                                pdwEffect = DragDropEffects.None;
                            }
                            goto Label_00A0;
                        }
                        finally {
                            PInvoke.ReleaseStgMedium(ref medium);
                        }
                    }
                    pdwEffect = DragDropEffects.None;
                }
                else
                {
                    pdwEffect = DragDropEffects.Copy;
                }
            }
            finally {
                if (pDataObj != null)
                {
                    Marshal.FinalReleaseComObject(pDataObj);
                }
            }
Label_00A0:
            return(0);
        }
Beispiel #5
0
        public static List <byte[][]> GetPidls(System.Runtime.InteropServices.ComTypes.IDataObject pDataObj)
        {
            List <byte[][]> lsRet = new List <byte[][]>();

            try
            {
                STGMEDIUM medium;
                System.Runtime.InteropServices.ComTypes.FORMATETC formatShell = new System.Runtime.InteropServices.ComTypes.FORMATETC()
                {
                    cfFormat = (Int16)DataFormats.GetFormat(NativeMethods.CFSTR_SHELLIDLIST).Id,
                    dwAspect = DVASPECT.DVASPECT_CONTENT,
                    tymed    = TYMED.TYMED_HGLOBAL
                };
                System.Runtime.InteropServices.ComTypes.FORMATETC format = new System.Runtime.InteropServices.ComTypes.FORMATETC()
                {
                    cfFormat = (Int16)DataFormats.GetFormat(NativeMethods.CF_HDROP).Id,
                    dwAspect = DVASPECT.DVASPECT_CONTENT,
                    tymed    = TYMED.TYMED_HGLOBAL
                };
                int ret = pDataObj.QueryGetData(ref format);
                if (ret > 0)
                {
                    pDataObj.GetData(ref formatShell, out medium);

                    IntPtr ptr;
                    ptr = medium.unionmember;

                    IntPtr ptrLock = NativeMethods.GlobalLock(ptr);

                    lsRet = ProcessCIDA_Pidl(ptr);

                    NativeMethods.GlobalUnlock(ptrLock);
                }
            }
            catch (Exception)
            {
            }

            return(lsRet);
        }
Beispiel #6
0
        private int QueryGetDataInner(ref FORMATETC format)
        {
            var hr = Consts.S_FALSE;

            SecurityHelper.DemandUnmanagedCode();
            new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Assert(); // BlessedAssert

            try
            {
                hr = _oleDataObject.QueryGetData(ref format);
            }
            catch (Exception exception)
            {
                Logger.Instance.Error(exception);
            }
            finally
            {
                CodeAccessPermission.RevertAssert();
            }

            return(hr);
        }
Beispiel #7
0
        public static bool TryGetData <T>(this IDataObject dataObject, string format, out T data) where T : struct
        {
            var formatEtc = CreateFormatEtc(format, TYMED.TYMED_HGLOBAL);

            if (NativeUtils.Failed(dataObject.QueryGetData(ref formatEtc)))
            {
                data = default(T);
                return(false);
            }

            dataObject.GetData(ref formatEtc, out var medium);

            try
            {
                data = Marshal.PtrToStructure <T>(medium.unionmember);

                return(true);
            }
            finally
            {
                NativeMethods.Ole32.ReleaseStgMedium(ref medium);
            }
        }
 private int QueryGetDataUnsafe(ref FORMATETC formatetc)
 {
     return(_innerData.QueryGetData(ref formatetc));
 }
 public int DragEnter(IDataObject pDataObj, int grfKeyState, Point pt, ref DragDropEffects pdwEffect)
 {
     try {
         if(DragFileEnter != null) {
             FORMATETC format = new FORMATETC();
             format.cfFormat = 15;
             format.ptd = IntPtr.Zero;
             format.dwAspect = DVASPECT.DVASPECT_CONTENT;
             format.lindex = -1;
             format.tymed = TYMED.TYMED_HGLOBAL;
             if(pDataObj.QueryGetData(ref format) >= 0) {
                 STGMEDIUM medium = new STGMEDIUM();
                 try {
                     try {
                         pDataObj.GetData(ref format, out medium);
                         pdwEffect = DragFileEnter(medium.unionmember, pt, grfKeyState);
                     }
                     catch {
                         pdwEffect = DragDropEffects.None;
                     }
                     goto Label_00A0;
                 }
                 finally {
                     PInvoke.ReleaseStgMedium(ref medium);
                 }
             }
             pdwEffect = DragDropEffects.None;
         }
         else {
             pdwEffect = DragDropEffects.Copy;
         }
     }
     finally {
         if(pDataObj != null) {
             Marshal.FinalReleaseComObject(pDataObj);
         }
     }
     Label_00A0:
     return 0;
 }
Beispiel #10
0
        public static List <string> GetFiles(System.Runtime.InteropServices.ComTypes.IDataObject pDataObj)
        {
            System.Runtime.InteropServices.ComTypes.FORMATETC formatV = new System.Runtime.InteropServices.ComTypes.FORMATETC()
            {
                cfFormat = (Int16)DataFormats.GetFormat(NativeMethods.CFSTR_FILEDESCRIPTORW).Id,
                dwAspect = DVASPECT.DVASPECT_CONTENT,
                tymed    = TYMED.TYMED_HGLOBAL
            };
            System.Runtime.InteropServices.ComTypes.FORMATETC formatShell = new System.Runtime.InteropServices.ComTypes.FORMATETC()
            {
                cfFormat = (Int16)DataFormats.GetFormat(NativeMethods.CFSTR_SHELLIDLIST).Id,
                dwAspect = DVASPECT.DVASPECT_CONTENT,
                tymed    = TYMED.TYMED_HGLOBAL
            };
            System.Runtime.InteropServices.ComTypes.FORMATETC format = new System.Runtime.InteropServices.ComTypes.FORMATETC()
            {
                cfFormat = (Int16)DataFormats.GetFormat(NativeMethods.CF_HDROP).Id,
                dwAspect = DVASPECT.DVASPECT_CONTENT,
                tymed    = TYMED.TYMED_HGLOBAL
            };

            STGMEDIUM medium;

            bool bVirtualData  = true;
            bool bVirtualShell = false;

            try
            {
                pDataObj.GetData(ref formatV, out medium);
            }
            catch (Exception)
            {
                if (pDataObj is System.Windows.Forms.DataObject)
                {
                    List <string> files1 = new List <string>();
                    //medium = new STGMEDIUM();
                    System.Windows.Forms.DataObject dob = (System.Windows.Forms.DataObject)pDataObj;
                    StringCollection z = (StringCollection)dob.GetData(typeof(StringCollection));
                    foreach (string s in z)
                    {
                        files1.Add(s);
                    }

                    /*
                     * if (dob.ContainsFileDropList())
                     * {
                     *  StringCollection c = dob.GetFileDropList();
                     *  foreach (string s in c)
                     *  {
                     *      files1.Add(s);
                     *  }
                     * }
                     * else
                     * {
                     *  string objFormat = dob.GetFormats().FirstOrDefault(x => x.Equals("FileDrop"));
                     *  if (!string.IsNullOrEmpty(objFormat))
                     *  {
                     *      object obj = dob.GetData("FileDrop");
                     *      if (obj is string)
                     *          files1.Add((string)obj);
                     *  }
                     * }
                     */
                    return(files1);
                }
                else
                {
                    int ret = pDataObj.QueryGetData(ref format);
                    if (ret > 0)
                    {
                        bVirtualShell = true;

                        Debug.WriteLine("!!!!SPECIAL FOLDER!!!!");
                        pDataObj.GetData(ref formatShell, out medium);
                    }
                    else
                    {
                        try
                        {
                            pDataObj.GetData(ref format, out medium);
                        }
                        catch (Exception)
                        {
                            bVirtualShell = true;

                            Debug.WriteLine("!!!!SPECIAL FOLDER!!!!");
                            pDataObj.GetData(ref formatShell, out medium);
                        }
                    }

                    /*
                     * if (ret != 0)
                     * {
                     *  Debug.WriteLine("------- GET FORMATS -------");
                     *  IEnumFORMATETC en = pDataObj.EnumFormatEtc(DATADIR.DATADIR_GET);
                     *  System.Runtime.InteropServices.ComTypes.FORMATETC[] fc = new System.Runtime.InteropServices.ComTypes.FORMATETC[10];
                     *  int[] fetched = new int[10];
                     *  int ret1 = en.Next(10, fc, fetched);
                     *  for (int i = 0; i < fetched[0]; i++)
                     *  {
                     *      DataFormats.Format f = DataFormats.GetFormat(fc[i].cfFormat);
                     *
                     *      string sn = f.Name;
                     *      Debug.WriteLine("FORMAT: " + sn);
                     *  }
                     *  Debug.WriteLine("---------------------------");
                     *
                     *  pDataObj.GetData(ref formatShell, out medium);
                     *  IntPtr ptr1;
                     *  ptr1 = medium.unionmember;
                     *  IntPtr ptrLock = NativeMethods.GlobalLock(ptr1);
                     *
                     *
                     *  List<IntPtr> lsUnk = ProcessCIDA(ptrLock);
                     *  foreach (IntPtr intPtr in lsUnk)
                     *  {
                     *      foreach (Environment.SpecialFolder suit in Enum.GetValues(typeof(Environment.SpecialFolder)))
                     *      {
                     *          var desktopPIDL = IntPtr.Zero;
                     *          int r = Shell32.SHGetSpecialFolderLocation(IntPtr.Zero, (int)suit, ref desktopPIDL);
                     *
                     *          string spath = Environment.GetFolderPath(suit);
                     *
                     *
                     *          string s1 = PidlManager.GetPidlDisplayName(desktopPIDL);
                     *          string s2 = PidlManager.GetPidlDisplayName(intPtr);
                     *
                     *          bool be = Shell32.ILIsEqual(intPtr, desktopPIDL);
                     *          if (be || s1.Equals(s2))
                     *          {
                     *              ItemIdList iptm = ItemIdList.Create(desktopPIDL);
                     *              byte[][] b = iptm.GetItemData();
                     *              string s = "finded!!!:" + suit;
                     *
                     *              ItemIdList iptm1 = ItemIdList.Create(intPtr);
                     *              byte[][] b1 = iptm1.GetItemData();
                     *          }
                     *      }
                     *
                     *      Shell32.ILFree(intPtr);
                     *  }
                     *
                     *  IntPtr ptrUnLock = NativeMethods.GlobalUnlock(ptrLock);
                     *
                     * }
                     * else
                     * {
                     *  pDataObj.GetData(ref format, out medium);
                     * }
                     */
                }

                bVirtualData = false;
            }

            IntPtr ptr;

            ptr = medium.unionmember;

            List <string> files = new List <string>();

            if (bVirtualData)
            {
                GetVirtualFileNamesFromDataObject(ptr, ref files);
            }
            else
            {
                if (!bVirtualShell)
                {
                    GetFileNamesFromDataObject(ptr, ref files);
                }
                else
                {
                    GetSystemVirtualFileNamesFromDataObject(ptr, ref files);
                }
            }

            NativeMethods.ReleaseStgMedium(ref medium);


            return(files);
        }