Ziehen Sie große virtuelle Dateien mit IStream mithilfe von VirtualFileDataObject per Drag & Drop

Ich benutze erfolgreichVirtualFileDataObject-Code aus Delays Blog, aber ich möchte vermeiden, die gesamte Datei in den Speicher zu streamen.

Ich habe diese zuvor beantwortete Frage zu Stack Overflow gefundenZiehen Sie große virtuelle Dateien per Drag & Drop von c # in den Windows Explorer Die Frage wurde von matthieu beantwortet, indem die Signatur der SetData-Methode geändert wurde.

Hier ist mein Problem, nach dem Ändern der Signatur der SetData-Methode suchen andere Stellen, die sie aufrufen, immer noch nach der alten Signatur.

Hier sind die ursprünglichen SetData;

   public void SetData(short dataFormat, int index, Action<Stream> streamData)
    {
        _dataObjects.Add(
            new DataObject
            {
                FORMATETC = new FORMATETC
                {
                    cfFormat = dataFormat,
                    ptd = IntPtr.Zero,
                    dwAspect = DVASPECT.DVASPECT_CONTENT,
                    lindex = index,
                    tymed = TYMED.TYMED_ISTREAM
                },
                GetData = () =>
                {
                    // Create IStream for data
                    var ptr = IntPtr.Zero;
                    var iStream = NativeMethods.CreateStreamOnHGlobal(IntPtr.Zero, true);
                    if (streamData != null)
                    {
                        // Wrap in a .NET-friendly Stream and call provided code to fill it
                        using (var stream = new IStreamWrapper(iStream))
                        {
                            streamData(stream);
                        }
                    }
                    // Return an IntPtr for the IStream
                    ptr = Marshal.GetComInterfaceForObject(iStream, typeof(IStream));
                    Marshal.ReleaseComObject(iStream);
                    return new Tuple<IntPtr, int>(ptr, NativeMethods.S_OK);
                },
            });
    }

matthieu schlug vor, es zu ändern;

public void SetData(short dataFormat, int index, Stream stream)
{
  ...
  var iStream = new StreamWrapper(stream);
  ...
  // Ensure the following line is commented out:
  //Marshal.ReleaseComObject(iStream);
  return new Tuple<IntPtr, int>(ptr, NativeMethods.S_OK);
 ...
}

Nachdem ich diese Änderungen vorgenommen habe, funktioniert der folgende Aufruf nicht mehr. (und hier brauche ich Hilfe) Wie kann ich diesen Anruf beheben?

            foreach (var fileDescriptor in fileDescriptors)
        {
            **SetData(FILECONTENTS, index, fileDescriptor.StreamContents);**
            index++;
        }

Grundsätzlich verursacht das Ändern von "Action streamData" in "Stream stream" meine Probleme. Ich bin nicht sicher, wie ich es aufrufen soll, nachdem die Änderungen vorgenommen wurden.

Der gesamte Code stammt von Delays VirtualFileDataObject. Ich weiß nicht, ob ich es hier posten soll oder nicht. Wenn Sie jedoch dem obigen Link folgen, gelangen Sie zum Blog, damit Sie ihn anzeigen können.

Ich bin so nah dran, kann diesen letzten Schritt einfach nicht herausfinden, danke, dass du einen Blick darauf geworfen hast

Antworten auf die Frage(1)

Ihre Antwort auf die Frage