Gong-wpf-dragdrop: Das Ziehen von Daten zwischen zwei Instanzen der Anwendung führt zu einer ungültigen Ausnahme (Ausnahme von HRESULT: 0x80040069 (DV_E_TYMED))

Erstellt am 18. Feb. 2013  ·  3Kommentare  ·  Quelle: punker76/gong-wpf-dragdrop

_Ursprünglicher Autor: cheaster ... @ gmail.com (07. Dezember 2010, 14:58:50 Uhr) _

Welche Schritte reproduzieren das Problem?

  1. Implementieren Sie IDragSource.
  2. Starten Sie das Ziehen von Daten (Zeile aus wpf-Datagrid in meinem Fall)
  3. Fügen Sie dem IDragInfo.Data-Objekt in StartDrag einen Klon benutzerdefinierter Daten hinzu.
  4. Ziehen Sie in der zweiten Anwendungsinstanz über dasselbe Datagrid.

Was ist die erwartete Leistung?

Die erwartete Ausgabe wären die geklonten Daten, die dem Datagrid hinzugefügt wurden. In den DragOver- und Drop-Ereignissen würde ich alle Datenprobleme behandeln. Ich komme jedoch nie so weit, weil die Ausnahme Invalid tymed (Ausnahme von HRESULT: 0x80040069 (DV_E_TYMED)) vom Betriebssystem in Zeile 135 in GongSolutions.Wpf.DragDrop.DropInfo.cs ausgelöst wird (Code ist Data = (e. Data.GetDataPresent (dataFormat))? E.Data.GetData (dataFormat): e.Data;).

Welche Version des Produkts verwenden Sie?
0.1.3 (Assembly-Version) - Ich habe aus dem Quellcode erstellt
Windows XP

Bitte geben Sie unten weitere Informationen an.

Ausnahmedetails folgen:

System.Runtime.InteropServices.COMException wurde vom Benutzercode nicht behandelt
Nachricht = Ungültig synchronisiert (Ausnahme von HRESULT: 0x80040069 (DV_E_TYMED))
Quelle = mscorlib
ErrorCode = -2147221399
StackTrace:
at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal (Int32 errorCode, IntPtr errorInfo)
at System.Runtime.InteropServices.Marshal.ThrowExceptionForHR (Int32 errorCode)
unter System.Windows.DataObject.System.Runtime.InteropServices.ComTypes.IDataObject.GetData (FORMATETC & formatetc, STGMEDIUM & medium)
at System.Runtime.InteropServices.ComTypes.IDataObject.GetData (FORMATETC & Format, STGMEDIUM & Medium)
bei System.Windows.DataObject.OleConverter.GetDataInner (FORMATETC & formatetc, STGMEDIUM & medium)
at System.Windows.DataObject.OleConverter.GetDataFromOleHGLOBAL (Zeichenfolgenformat, DVASPECT-Aspekt, Int32-Index)
at System.Windows.DataObject.OleConverter.GetDataFromBoundOleDataObject (Zeichenfolgenformat, DVASPECT-Aspekt, Int32-Index)
at System.Windows.DataObject.OleConverter.GetData (Zeichenfolgenformat, Boolescher AutoConvert, DVASPECT-Aspekt, Int32-Index)
at System.Windows.DataObject.OleConverter.GetData (String-Format, Boolean autoConvert)
at System.Windows.DataObject.GetData (Zeichenfolgenformat, Boolean autoConvert)
bei System.Windows.DataObject.GetData (String-Format)
at GongSolutions.Wpf.DragDrop.DropInfo..ctor (Objektabsender, DragEventArgs e, DragInfo dragInfo)
at GongSolutions.Wpf.DragDrop.DragDrop.DropTarget_PreviewDragOver (Objektabsender, DragEventArgs e)
bei GongSolutions.Wpf.DragDrop.DragDrop.DropTarget_PreviewDragEnter (Objektabsender, DragEventArgs e)
at System.Windows.DragEventArgs.InvokeEventHandler (delegate genericHandler, Object genericTarget)
at System.Windows.RoutedEventArgs.InvokeHandler (Delegate-Handler, Objektziel)
at System.Windows.RoutedEventHandlerInfo.InvokeHandler (Objektziel, RoutedEventArgs routedEventArgs)
at System.Windows.EventRoute.InvokeHandlersImpl (Objektquelle, RoutedEventArgs-Argumente, Boolean reRaised)
at System.Windows.UIElement.RaiseEventImpl (DependencyObject-Absender, RoutedEventArgs-Argumente)
bei System.Windows.UIElement.RaiseEvent (RoutedEventArgs e)
bei System.Windows.OleDropTarget.RaiseDragEvent (RoutedEvent dragEvent, Int32 dragDropKeyStates, Int32 & Effekte, DependencyObject-Ziel, Point targetPoint)
bei System.Windows.OleDropTarget.MS.Win32.UnsafeNativeMethods.IOleDropTarget.OleDragOver (Int32 dragDropKeyStates, Int64 point, Int32 & Effekte)
InnerException:

_Ursprüngliches Problem: http://code.google.com/p/gong-wpf-dragdrop/issues/detail?id=29_

Bug Imported from google code

Hilfreichster Kommentar

Ich hatte das DV_E_TYMED-Ausnahmeproblem in einer App, die ich entwickle, und möchte die gefundene Lösung teilen. Hier im Anhang finden Sie die Dateien aus Ihrem Projekt, die ich geändert habe, um das Problem zu beheben.
Grundsätzlich müssen Sie beim Ziehen von Objekten von einer Anwendung in eine andere COM verwenden, und COM erfordert, dass Objekte serialisierbar sind, damit sie korrekt ausgetauscht werden können.
Wenn Sie DataObject verwenden, können Sie nicht einfach einen von Ihnen erstellten DataFromat übergeben, da COM nichts darüber weiß. Ich habe stattdessen eine Wrapper-Klasse (DragDropDataWrapper) erstellt, die als [Serializable] markiert ist und ISerializable implementiert. Jedes Mal, wenn ich ein DataObject erstellen muss, mache ich: neues DataObject (neuer DragDropDataWrapper (Daten)). Auf der Drop-Seite kann ich jetzt meine Daten mit DataFormat.Serializable abrufen, das COM-erkennbar ist.
Ich musste andere kleinere Dinge reparieren, damit das Beispiel funktioniert, dh den Fall verwalten, wenn DragInfo null ist.
Wenn Sie das BoundTree-Beispiel überprüfen, sollte es jetzt anwendungsübergreifend funktionieren.
CrossApplicationDragDropFix.zip

Alle 3 Kommentare

_Von Cheaster ... @ gmail.com am 07. Dezember 2010 15: 25: 00_
Ein bisschen mehr Infos ....

Es scheint, dass das eigentliche Problem darin besteht, dass ich IDragInfo.Data auf ein System.Windows.DataObject-Objekt setze. Ich füge eine Beispielanwendung bei, um das Problem zu demonstrieren.

Führen Sie die folgenden Schritte aus, um den Fehler anzuzeigen. Führen Sie zwei Instanzen der Anwendung aus und versuchen Sie, ein Element aus dem Listenfeld zwischen den beiden Instanzen zu ziehen.

Der Grund, warum ich ein DataObject verwende, ist, dass ich auch das Ablegen von Dateien in das Betriebssystem zulassen muss.

_From fahad ... @ gmail.com am 24. August 2011 20: 46: 51_
Fügen Sie hier Ihre Stimme für dieses Problem hinzu
https://connect.microsoft.com/WPF/feedback/details/682826/comexception-of-type-dv-e-tymed-occurs-when-a-break-point-hit-as-a-result-of- Schleppen

Ich hatte das DV_E_TYMED-Ausnahmeproblem in einer App, die ich entwickle, und möchte die gefundene Lösung teilen. Hier im Anhang finden Sie die Dateien aus Ihrem Projekt, die ich geändert habe, um das Problem zu beheben.
Grundsätzlich müssen Sie beim Ziehen von Objekten von einer Anwendung in eine andere COM verwenden, und COM erfordert, dass Objekte serialisierbar sind, damit sie korrekt ausgetauscht werden können.
Wenn Sie DataObject verwenden, können Sie nicht einfach einen von Ihnen erstellten DataFromat übergeben, da COM nichts darüber weiß. Ich habe stattdessen eine Wrapper-Klasse (DragDropDataWrapper) erstellt, die als [Serializable] markiert ist und ISerializable implementiert. Jedes Mal, wenn ich ein DataObject erstellen muss, mache ich: neues DataObject (neuer DragDropDataWrapper (Daten)). Auf der Drop-Seite kann ich jetzt meine Daten mit DataFormat.Serializable abrufen, das COM-erkennbar ist.
Ich musste andere kleinere Dinge reparieren, damit das Beispiel funktioniert, dh den Fall verwalten, wenn DragInfo null ist.
Wenn Sie das BoundTree-Beispiel überprüfen, sollte es jetzt anwendungsübergreifend funktionieren.
CrossApplicationDragDropFix.zip

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen