Gong-wpf-dragdrop: Le fait de faire glisser des données entre deux instances de l'application provoque une exception tymed non valide (exception de HRESULT: 0x80040069 (DV_E_TYMED))

Créé le 18 févr. 2013  ·  3Commentaires  ·  Source: punker76/gong-wpf-dragdrop

_Auteur original: cheapster ... @ gmail.com (7 décembre 2010 14:58:50) _

Quelles étapes vont reproduire le problème?

  1. Implémentez IDragSource.
  2. Commencer le glisser des données (ligne de wpf datagrid dans mon cas)
  3. Ajoutez un clone de données définies par l'utilisateur à l'objet IDragInfo.Data dans StartDrag.
  4. Faites glisser sur la même grille de données dans la deuxième instance de l'application.

Quelle est l'attente de production?

Le résultat attendu serait les données clonées ajoutées à la grille de données. Dans les événements DragOver et Drop, je traiterais tous les problèmes de données. Cependant, je n'arrive jamais aussi loin parce que l'exception tymed Invalid (Exception from HRESULT: 0x80040069 (DV_E_TYMED)) est déclenchée par l'O / S à la ligne 135 dans GongSolutions.Wpf.DragDrop.DropInfo.cs (le code est Data = (e. Data.GetDataPresent (dataFormat))? E.Data.GetData (dataFormat): e.Data;).

Quelle version du produit utilisez-vous?
0.1.3 (version Assembly) - J'ai construit à partir des sources
Windows XP

Veuillez fournir toute information supplémentaire ci-dessous.

Les détails de l'exception suivent:

System.Runtime.InteropServices.COMException n'a pas été gérée par le code utilisateur
Message = tymed non valide (exception de HRESULT: 0x80040069 (DV_E_TYMED))
Source = mscorlib
ErrorCode = -2147221399
Trace de la pile:
à System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal (Int32 errorCode, IntPtr errorInfo)
à System.Runtime.InteropServices.Marshal.ThrowExceptionForHR (Int32 errorCode)
à System.Windows.DataObject.System.Runtime.InteropServices.ComTypes.IDataObject.GetData (FORMATETC & formatetc, STGMEDIUM & medium)
à System.Runtime.InteropServices.ComTypes.IDataObject.GetData (FORMATETC & format, STGMEDIUM & medium)
à System.Windows.DataObject.OleConverter.GetDataInner (FORMATETC & formatetc, STGMEDIUM & medium)
à System.Windows.DataObject.OleConverter.GetDataFromOleHGLOBAL (format de chaîne, aspect DVASPECT, index Int32)
à System.Windows.DataObject.OleConverter.GetDataFromBoundOleDataObject (format de chaîne, aspect DVASPECT, index Int32)
à System.Windows.DataObject.OleConverter.GetData (format de chaîne, Boolean autoConvert, aspect DVASPECT, index Int32)
à System.Windows.DataObject.OleConverter.GetData (format de chaîne, Boolean autoConvert)
à System.Windows.DataObject.GetData (format de chaîne, Boolean autoConvert)
à System.Windows.DataObject.GetData (format de chaîne)
à GongSolutions.Wpf.DragDrop.DropInfo..ctor (Expéditeur d'objet, DragEventArgs e, DragInfo dragInfo)
à GongSolutions.Wpf.DragDrop.DragDrop.DropTarget_PreviewDragOver (Expéditeur d'objet, DragEventArgs e)
à GongSolutions.Wpf.DragDrop.DragDrop.DropTarget_PreviewDragEnter (Expéditeur d'objet, DragEventArgs e)
à System.Windows.DragEventArgs.InvokeEventHandler (Delegate genericHandler, Object genericTarget)
à System.Windows.RoutedEventArgs.InvokeHandler (gestionnaire de délégués, cible d'objet)
à System.Windows.RoutedEventHandlerInfo.InvokeHandler (Object target, RoutedEventArgs routedEventArgs)
à System.Windows.EventRoute.InvokeHandlersImpl (Object source, RoutedEventArgs args, Boolean reRaised)
à System.Windows.UIElement.RaiseEventImpl (expéditeur de l'objet DependencyObject, arguments RoutedEventArgs)
à System.Windows.UIElement.RaiseEvent (RoutedEventArgs e)
à System.Windows.OleDropTarget.RaiseDragEvent (RoutedEvent dragEvent, Int32 dragDropKeyStates, Int32 & effets, DependencyObject target, Point targetPoint)
à System.Windows.OleDropTarget.MS.Win32.UnsafeNativeMethods.IOleDropTarget.OleDragOver (Int32 dragDropKeyStates, point Int64, Int32 et effets)
InnerException:

_Problème d'origine: http://code.google.com/p/gong-wpf-dragdrop/issues/detail?id=29_

Bug Imported from google code

Commentaire le plus utile

J'ai rencontré le problème d'exception DV_E_TYMED dans une application que je développe et j'aimerais partager la solution que j'ai trouvée. Ci-joint, vous pouvez trouver les fichiers de votre projet que j'ai modifiés afin de résoudre le problème.
Fondamentalement, lorsque vous faites glisser des objets d'une application à une autre, vous devez utiliser COM et COM exige que les objets soient sérialisables pour être échangés correctement.
Lorsque vous utilisez DataObject, vous ne pouvez pas simplement transmettre un DataFromat que vous avez créé, car COM n'en saura rien. J'ai plutôt créé une classe wrapper (DragDropDataWrapper) qui est marquée comme [Serializable] et implémente ISerializable. Ensuite, chaque fois que je dois créer un DataObject, je le fais: nouveau DataObject (nouveau DragDropDataWrapper (données)). Du côté de la goutte, je peux maintenant récupérer mes données à l'aide de DataFormat.Serializable, qui est reconnaissable par COM.
J'ai dû corriger d'autres petites choses pour que l'exemple fonctionne, c'est-à-dire gérer le cas où DragInfo est nul.
Si vous cochez l'exemple BoundTree, il devrait maintenant fonctionner entre les applications.
CrossApplicationDragDropFix.zip

Tous les 3 commentaires

_De cheapster ... @ gmail.com le 07 décembre 2010 15: 25: 00_
Un peu plus d'infos ...

Il semble que le vrai problème soit lorsque je définis le IDragInfo.Data sur un objet System.Windows.DataObject. Je joins un exemple d'application pour démontrer le problème.

Pour voir l'erreur, procédez comme suit. Exécutez deux instances de l'application, essayez de faire glisser un élément de la zone de liste entre les deux instances.

La raison pour laquelle j'utilise un DataObject est que je dois également autoriser la suppression de fichiers vers le système d'exploitation.

_De fahad ... @ gmail.com le 24 août 2011 20: 46: 51_
Ajoutez votre voix ici pour ce problème
https://connect.microsoft.com/WPF/feedback/details/682826/comexception-of-type-dv-e-tymed-occurs-when-a-break-point-hit-as-a-result-of- traînant

J'ai rencontré le problème d'exception DV_E_TYMED dans une application que je développe et j'aimerais partager la solution que j'ai trouvée. Ci-joint, vous pouvez trouver les fichiers de votre projet que j'ai modifiés afin de résoudre le problème.
Fondamentalement, lorsque vous faites glisser des objets d'une application à une autre, vous devez utiliser COM et COM exige que les objets soient sérialisables pour être échangés correctement.
Lorsque vous utilisez DataObject, vous ne pouvez pas simplement transmettre un DataFromat que vous avez créé, car COM n'en saura rien. J'ai plutôt créé une classe wrapper (DragDropDataWrapper) qui est marquée comme [Serializable] et implémente ISerializable. Ensuite, chaque fois que je dois créer un DataObject, je le fais: nouveau DataObject (nouveau DragDropDataWrapper (données)). Du côté de la goutte, je peux maintenant récupérer mes données à l'aide de DataFormat.Serializable, qui est reconnaissable par COM.
J'ai dû corriger d'autres petites choses pour que l'exemple fonctionne, c'est-à-dire gérer le cas où DragInfo est nul.
Si vous cochez l'exemple BoundTree, il devrait maintenant fonctionner entre les applications.
CrossApplicationDragDropFix.zip

Cette page vous a été utile?
0 / 5 - 0 notes