public void Clone(out IEnumFORMATETC newEnum) { //Create new enumerators newEnum = new FormatEtcEnumerator(formats); }
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); } } }