private static int Next(IntPtr thisPtr, int celt, FORMATETC *rgelt, int *pceltFetched) { try { IEnumFORMATETC instance = ComInterfaceDispatch.GetInstance <IEnumFORMATETC>((ComInterfaceDispatch *)thisPtr); FORMATETC[] elt = new FORMATETC[celt]; int[] celtFetched = new int[1]; // Eliminate null bang after https://github.com/dotnet/runtime/pull/68537 lands, or // IEnumFORMATETC annotations would be corrected. var result = instance.Next(celt, elt, pceltFetched is null ? null ! : celtFetched); for (var i = 0; i < celt; i++) { rgelt[i] = elt[i]; } if (pceltFetched is not null) { *pceltFetched = celtFetched[0]; } return(result); } catch (Exception ex) { Debug.WriteLine(ex); return(ex.HResult); } }
public IEnumerable <DataObjectFormat> GetFormats() { IEnumFORMATETC enumFormatEtc = null !; try { enumFormatEtc = DataObject.EnumFormatEtc(DATADIR.DATADIR_GET); if (enumFormatEtc == null) { return(Array.Empty <DataObjectFormat>()); } enumFormatEtc.Reset(); var fe = new FORMATETC[1]; var fs = new List <DataObjectFormat>(); while (enumFormatEtc.Next(1, fe, null) == 0) { fs.Add(new DataObjectFormat(fe[0])); } return(fs); } finally { if (enumFormatEtc != null) { Marshal.ReleaseComObject(enumFormatEtc); } } }
public virtual string[] GetFormats(bool autoConvert) { Debug.Assert(innerData != null, "You must have an innerData on all DataObjects"); IEnumFORMATETC enumFORMATETC = null; ArrayList formats = new ArrayList(); try { enumFORMATETC = innerData.EnumFormatEtc(DATADIR.DATADIR_GET); } catch { } if (enumFORMATETC != null) { enumFORMATETC.Reset(); FORMATETC[] formatetc = new FORMATETC[] { new FORMATETC() }; int[] retrieved = new int[] { 1 }; while (retrieved[0] > 0) { retrieved[0] = 0; try { enumFORMATETC.Next(1, formatetc, retrieved); } catch { } if (retrieved[0] > 0) { string name = DataFormats.GetFormat(formatetc[0].cfFormat).Name; if (autoConvert) { string[] mappedFormats = GetMappedFormats(name); for (int i = 0; i < mappedFormats.Length; i++) { formats.Add(mappedFormats[i]); } } else { formats.Add(name); } } } } string[] temp = new string[formats.Count]; formats.CopyTo(temp, 0); return(GetDistinctStrings(temp)); }
public virtual string[] GetFormats(bool autoConvert) { Debug.Assert(innerData != null, "You must have an innerData on all DataObjects"); IEnumFORMATETC enumFORMATETC = null; // Since we are only adding elements to the HashSet, the order will be preserved. HashSet <string> distinctFormats = new HashSet <string>(); try { enumFORMATETC = innerData.EnumFormatEtc(DATADIR.DATADIR_GET); } catch { } if (enumFORMATETC != null) { enumFORMATETC.Reset(); FORMATETC[] formatetc = new FORMATETC[] { new FORMATETC() }; int[] retrieved = new int[] { 1 }; while (retrieved[0] > 0) { retrieved[0] = 0; try { enumFORMATETC.Next(1, formatetc, retrieved); } catch { } if (retrieved[0] > 0) { string name = DataFormats.GetFormat(formatetc[0].cfFormat).Name; if (autoConvert) { string[] mappedFormats = GetMappedFormats(name); for (int i = 0; i < mappedFormats.Length; i++) { distinctFormats.Add(mappedFormats[i]); } } else { distinctFormats.Add(name); } } } } return(distinctFormats.ToArray()); }
public int EnumFormatEtc(DATADIR direction, out IEnumFORMATETC ppenumFormatEtc) { IEnumFORMATETC origEnum = null; try { log.DebugFormat("IDataObject.EnumFormatEtc called -- direction {0}", direction); switch (direction) { case DATADIR.DATADIR_GET: //Get original enumerator int result = innerData.EnumFormatEtc(direction, out origEnum); if (result != NativeMethods.S_OK) { ppenumFormatEtc = null; return(result); } //Enumerate original formats List <FORMATETC> formats = new List <FORMATETC>(); FORMATETC[] buffer = new FORMATETC[] { new FORMATETC() }; while (origEnum.Next(1, buffer, null) == NativeMethods.S_OK) { //Convert format from short to unsigned short ushort cfFormat = (ushort)buffer[0].cfFormat; //Do not return text formats -- some applications try to get text before files if (cfFormat != NativeMethods.CF_TEXT && cfFormat != NativeMethods.CF_UNICODETEXT && cfFormat != (ushort)DataObjectHelper.GetClipboardFormat("Csv")) { formats.Add(buffer[0]); } } //Add CF_HDROP format FORMATETC format = new FORMATETC(); format.cfFormat = NativeMethods.CF_HDROP; format.dwAspect = DVASPECT.DVASPECT_CONTENT; format.lindex = -1; format.ptd = IntPtr.Zero; format.tymed = TYMED.TYMED_HGLOBAL; formats.Add(format); //Return new enumerator for available formats ppenumFormatEtc = new FormatEtcEnumerator(formats.ToArray()); return(NativeMethods.S_OK); case DATADIR.DATADIR_SET: //Return original enumerator return(innerData.EnumFormatEtc(direction, out ppenumFormatEtc)); default: //Invalid direction ppenumFormatEtc = null; return(NativeMethods.E_INVALIDARG); } } catch (Exception ex) { log.Error("Exception in IDataObject.EnumFormatEtc", ex); ppenumFormatEtc = null; return(NativeMethods.E_UNEXPECTED); } finally { //Release all unmanaged objects if (origEnum != null) { Marshal.ReleaseComObject(origEnum); } } }