'Неправильная структура FORMATETC' C# при перетаскивании

Я пытаюсь преобразовать данные dataObject в формат CF_HDROP, когда начинается операция перетаскивания. Я смог прочитать byteArray, который я буду хранить в какой-то момент, но сейчас я жестко программирую путь к файлу, который действительно существует на моем диске.

Я использовал эту проблему перетаскивания C# в качестве ссылки.

Вот моя реализация для функции OleDragEnter:

public int OleDragEnter(object pDataObj, int grfKeyState, long pt, ref int pdwEffect)
    {
        if (pDataObj is IDataObject dataOb)
        {
            IEnumFORMATETC formatetc = dataOb.EnumFormatEtc(DATADIR.DATADIR_GET);
            List<FORMATETC> formatetcList = GetFormatEtcList(formatetc);

            if (formatetcList.Exists(f => f.tymed == TYMED.TYMED_ISTREAM))
            {
                FORMATETC iStreamFormatetc = formatetcList.Find(f => f.tymed == TYMED.TYMED_ISTREAM);

                dataOb.GetData(ref iStreamFormatetc, out var stgmedium);
                MemoryStream memStream = GetIStream(stgmedium);

                byte[] rawData = memStream.ToArray(); //I will store this on the drive at somepoint
                var fileName = StreamHelpers.GetFullFileName(); //Constant for now
                String[] strFiles = {fileName};

                _DROPFILES dropFiles = new _DROPFILES();
                int intChar, intFile, intDataLen, intPos;
                IntPtr ipGlobal = IntPtr.Zero;

                intDataLen = 0;
                for (intFile = 0; intFile <= strFiles.GetUpperBound(0); intFile++)
                {
                    intDataLen += strFiles[intFile].Length + 1;
                }

                intDataLen++;

                var byteData = new Byte[intDataLen];
                intPos = 0;

                for (intFile = 0; intFile <= strFiles.GetUpperBound(0); intFile++)
                {
                    for (intChar = 0; intChar < strFiles[intFile].Length; intChar++)
                    {
                        byteData[intPos++] = (byte)strFiles[intFile][intChar];
                    }
                    byteData[intPos++] = 0;
                }

                byteData[intPos++] = 0;

                int intTotalLen = Marshal.SizeOf(dropFiles) + intDataLen;
                ipGlobal = Marshal.AllocHGlobal(intTotalLen);

                if (ipGlobal == IntPtr.Zero)
                {
                    return -1;
                }

                dropFiles.pFiles = Marshal.SizeOf(dropFiles);
                dropFiles.fWide = false;

                Marshal.StructureToPtr(dropFiles, ipGlobal, false);
                IntPtr ipNew = new IntPtr(ipGlobal.ToInt32() + Marshal.SizeOf(dropFiles));
                Marshal.Copy(byteData, 0, ipNew, intDataLen);

                var formatEtc = new FORMATETC
                {
                    cfFormat = (short) CLIPFORMAT.CF_HDROP, //15
                    dwAspect = DVASPECT.DVASPECT_CONTENT,
                    lindex = -1,
                    tymed = TYMED.TYMED_HGLOBAL,
                    ptd = IntPtr.Zero
                };

                var stgMedium = new STGMEDIUM
                {
                    unionmember = ipGlobal,
                    tymed = TYMED.TYMED_HGLOBAL,
                    pUnkForRelease = IntPtr.Zero
                };

                dataOb.SetData(ref formatEtc, ref stgMedium, false);
            }


        }
        return 0;
    }

Я получаю сообщение об ошибке "Неверная структура FORMATETC":

dataOb.SetData(ref formatEtc, ref stgMedium, false);

Я попытался запустить приложение в режиме без отладки и проверил целостность файла. Я заметил, что DATADIR.DATADIR_SET не возвращает никаких доступных форматов. Может ли это быть проблема?

Редактировать: Кажется, это также происходит, когда я пытаюсь использовать тот же объект formatEtc и объект stgMedium, которые используются для чтения данных без каких-либо изменений.

0 ответов

Другие вопросы по тегам