| 

.NET C# Java Javascript Exception

3
Es ist ganz einfach:

void Copy()
{
StringCollection fileDropList = new StringCollection()
{
"C:\meine_testdatei.txt"
};

Clipboard.SetData(DataFormats.FileDrop, fileDropList);
}

void Paste()
{
StringCollection fileDropList;

if( Clipboard.ContainsData(DataFormats.FileDrop) )
{
fileDropList = Clipboard.GetData(DataFormats.FileDrop); // <- OutOfMemoryException
// ...
}
}


Alle Fundstellen, die ich bisher dazu gefunden haben, sagen das gleiche: Der Typ, der in die Zwischenablage kopiert werden soll, muss das ISerializableAttribut besitzen.

Schön und gut, aber die StringCollection sowie alle darin enthaltenen Strings sind mit diesem Attribut versehen (es sind die .NET-eigenen Klassen). Wenn ich die entsprechende Datei über den Windows-Explorer in die Zwischenablage kopiere, enthält diese ebenfalls eine StringCollection mit demselben Eintrag. Aber es kommt keine OutOfMemoryException.

Kann mir jemand helfen?
17.02.2012
Andreas Ganzer 1,4k 1 8
2 Antworten
1
Wenn ich mir so die MSDN-Doku ansehe - gibt es irgendeinen Grund, warum Du nicht SetFileDropList (und entsprechend GetFileDropList beim Auslesen) verwendest?
19.02.2012
Matthias Hlawatsch 13,2k 4 9
Weil das alles Synonym ist. SetFileDropList und GetFileDropList kapseln lediglich das zusätzliche Argument und nehmen eine automatische Konverierung in den entsprechenden Typ vor.

Abgesehen davon: zuerst hatte ich diese Methoden verwendet. Das Ergebnis ist immer dasselbe.
Andreas Ganzer 21.02.2012
1
Ich habe Deinen Code ausprobiert (1:1, nur für's Compilieren noch einen Cast auf StringCollection eingebaut) und bekomme ebenfalls die Exception. Mit Get/SetFileDropList hingegen funktioniert es tadellos.
Matthias Hlawatsch 22.02.2012
Warscheinlich hatte ich schon so viele Kombinationen durch, dass ich gerade GetFileDropList und SetFileDropList in Verbindung miteinander tatsächlich übersehen hatte.

Es funktioniert jetzt und die Kommunikation mit dem Explorer geht auch.

Herzlichen Dank für die Mühe :-)
Andreas Ganzer 23.02.2012
0
Hallo,
so wie ich das sehe versuchst du ein serialisierbares Objekt in die Zwischenablage zu legen, verwendest jedoch "FileDrop", was für Drag & Drop Operationen vorgesehen ist. Link zur Doku.
Versuche es mal stattdessen mit
Clipboard.SetData(DataFormats.Serializable, fileDropList);
(Paste analog)
Gruß
Daniel
19.02.2012
puls200 3,8k 7
Das hat leider nichts damit zu tun. Der Explorer verwendet ebenfalls dieses Format. Das kann man im Debugger prüfen und GetData(DataFormats.FileDrop) funktioniert in diesem Fall einwandfrei.

Das Problem muss in der SetData-Methode liegen, denn wenn ich irgendetwas anderes, als DataFormats.FileDrop angebe (z.B. "MeineListe"), dann führt auch GetData("MeineListe") nicht zu einer Ausnahme.

Auch ist es nicht mehr möglich mit Windows zu kommunizieren, wenn ich ein anderes Format angebe, weil Windows DataFormats.FileDrop erwartet (nur dann ist der Einfügen-Befehl im Explorer aktiviert).
Andreas Ganzer 19.02.2012
Liefert denn Clipboard.ContainsFileDropList() true zurück? (http://msdn.microsoft.com/en-us/library/637ys738.aspx)
puls200 19.02.2012
Ja ups, hast du oben geschrieben. Wer lesen kann...
Vielleicht kann man das Ergebnis einem type Object zuweisen statt ein cast auf eine StringCollection zu machen, evtl. kommst du dann dahinter, was für ein Objekt deserialisiert wird.
puls200 19.02.2012
Der Debugger zeigt, dass die Ausnahme im COM-Modul des Clipboards ausgeworfen wird (noch genauer: in einem OLE-Konverter).

Ich habe also keine Gelegenheit, einen cast zu verwenden.

Hat denn noch niemand versucht, mit WPF eine Anwendung zu schreiben, die aus dem Explorer Dateien einfügen und für den Explorer bereitstellen kann??? Es muss doch eine Möglichkeit geben, ohne gleich die API zu verwenden -- dann funktioniert es nämlich ;-)
Andreas Ganzer 21.02.2012

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH