Gong-wpf-dragdrop: Arrastrar datos entre dos instancias de la aplicación provoca una excepción de tymed no válido (excepción de HRESULT: 0x80040069 (DV_E_TYMED))

Creado en 18 feb. 2013  ·  3Comentarios  ·  Fuente: punker76/gong-wpf-dragdrop

_Autor original: cheaster ... @ gmail.com (07 de diciembre de 2010 14:58:50) _

¿Qué pasos reproducirán el problema?

  1. Implemente IDragSource.
  2. Iniciar arrastre de datos (fila de wpf datagrid en mi caso)
  3. Agregue un clon de datos definidos por el usuario al objeto IDragInfo.Data en StartDrag.
  4. Arrastre sobre la misma cuadrícula de datos en la segunda instancia de la aplicación.

cual es la salida esperada?

La salida esperada serían los datos clonados agregados a la cuadrícula de datos. En los eventos DragOver y Drop, manejaría cualquier problema de datos. Sin embargo, nunca llego tan lejos porque el O / S en la línea 135 en GongSolutions.Wpf.DragDrop.DropInfo.cs (el código es Data = (e. Data.GetDataPresent (dataFormat))? E.Data.GetData (dataFormat): e.Data;).

¿Qué versión del producto está utilizando?
0.1.3 (versión de ensamblaje): construí desde la fuente
Windows XP

Proporcione cualquier información adicional a continuación.

Los detalles de la excepción son los siguientes:

El código de usuario no controló la excepción System.Runtime.InteropServices.COMException
Mensaje = Tymed no válido (Excepción de HRESULT: 0x80040069 (DV_E_TYMED))
Fuente = mscorlib
ErrorCode = -2147221399
StackTrace:
en System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal (Int32 errorCode, IntPtr errorInfo)
en System.Runtime.InteropServices.Marshal.ThrowExceptionForHR (código de error Int32)
en System.Windows.DataObject.System.Runtime.InteropServices.ComTypes.IDataObject.GetData (FORMATETC y formatetc, STGMEDIUM y medio)
en System.Runtime.InteropServices.ComTypes.IDataObject.GetData (FORMATETC y formato, STGMEDIUM y medio)
en System.Windows.DataObject.OleConverter.GetDataInner (FORMATETC y formatetc, STGMEDIUM y medio)
en System.Windows.DataObject.OleConverter.GetDataFromOleHGLOBAL (formato de cadena, aspecto DVASPECT, índice Int32)
en System.Windows.DataObject.OleConverter.GetDataFromBoundOleDataObject (formato de cadena, aspecto DVASPECT, índice Int32)
en System.Windows.DataObject.OleConverter.GetData (formato de cadena, conversión automática booleana, aspecto DVASPECT, índice Int32)
en System.Windows.DataObject.OleConverter.GetData (formato de cadena, conversión automática booleana)
en System.Windows.DataObject.GetData (formato de cadena, conversión automática booleana)
en System.Windows.DataObject.GetData (formato de cadena)
en GongSolutions.Wpf.DragDrop.DropInfo..ctor (remitente del objeto, DragEventArgs e, DragInfo dragInfo)
en GongSolutions.Wpf.DragDrop.DragDrop.DropTarget_PreviewDragOver (remitente del objeto, DragEventArgs e)
en GongSolutions.Wpf.DragDrop.DragDrop.DropTarget_PreviewDragEnter (remitente del objeto, DragEventArgs e)
en System.Windows.DragEventArgs.InvokeEventHandler (Delegate genericHandler, Object genericTarget)
en System.Windows.RoutedEventArgs.InvokeHandler (controlador delegado, destino del objeto)
en System.Windows.RoutedEventHandlerInfo.InvokeHandler (destino de objeto, RoutedEventArgs routedEventArgs)
en System.Windows.EventRoute.InvokeHandlersImpl (origen del objeto, argumentos de RoutedEventArgs, booleano reRaised)
en System.Windows.UIElement.RaiseEventImpl (DependencyObject sender, RoutedEventArgs args)
en System.Windows.UIElement.RaiseEvent (RoutedEventArgs e)
en System.Windows.OleDropTarget.RaiseDragEvent (RoutedEvent dragEvent, Int32 dragDropKeyStates, Int32 y efectos, DependencyObject target, Point targetPoint)
en System.Windows.OleDropTarget.MS.Win32.UnsafeNativeMethods.IOleDropTarget.OleDragOver (Int32 dragDropKeyStates, Int64 point, Int32 y efectos)
InnerException:

_Edición original: http://code.google.com/p/gong-wpf-dragdrop/issues/detail?id=29_

Bug Imported from google code

Comentario más útil

Enfrenté el problema de excepción DV_E_TYMED en una aplicación que estoy desarrollando y me gustaría compartir la solución que encontré. Aquí adjunto puede encontrar los archivos de su proyecto que modifiqué para solucionar el problema.
Básicamente, al arrastrar objetos de una aplicación a otra, debe utilizar COM y COM requiere que los objetos sean serializables para intercambiarlos correctamente.
Cuando usa DataObject, no puede simplemente pasar un DataFromat que creó, porque COM no sabrá nada al respecto. En su lugar, creé una clase contenedora (DragDropDataWrapper) que está marcada como [Serializable] e implementa ISerializable. Luego, cada vez que necesito crear un DataObject, lo hago: nuevo DataObject (nuevo DragDropDataWrapper (datos)). En el lado desplegable, ahora puedo recuperar mis datos usando DataFormat.Serializable, que es reconocible por COM.
Tuve que arreglar otras cosas menores para que el ejemplo funcionara, es decir, administrar el caso cuando DragInfo es nulo.
Si comprueba el ejemplo de BoundTree, ahora debería funcionar en aplicaciones cruzadas.
CrossApplicationDragDropFix.zip

Todos 3 comentarios

_De cheaster ... @ gmail.com el 07 de diciembre de 2010 15: 25: 00_
Un poco más de información ...

Parece que el problema real es cuando configuro IDragInfo.Data en un objeto System.Windows.DataObject. Adjunto una aplicación de muestra para hacer una demostración del problema.

Para ver el error, realice los siguientes pasos. Ejecute dos instancias de la aplicación, intente arrastrar un elemento del cuadro de lista entre las dos instancias.

La razón por la que estoy usando un DataObject es que también necesito permitir el envío de archivos al O / S.

_De fahad ... @ gmail.com el 24 de agosto de 2011 20: 46: 51_
Agregue su voz aquí para este problema
https://connect.microsoft.com/WPF/feedback/details/682826/comexception-of-type-dv-e-tymed-occurs-when-a-break-point-hit-as-a-result-of- arrastrando

Enfrenté el problema de excepción DV_E_TYMED en una aplicación que estoy desarrollando y me gustaría compartir la solución que encontré. Aquí adjunto puede encontrar los archivos de su proyecto que modifiqué para solucionar el problema.
Básicamente, al arrastrar objetos de una aplicación a otra, debe utilizar COM y COM requiere que los objetos sean serializables para intercambiarlos correctamente.
Cuando usa DataObject, no puede simplemente pasar un DataFromat que creó, porque COM no sabrá nada al respecto. En su lugar, creé una clase contenedora (DragDropDataWrapper) que está marcada como [Serializable] e implementa ISerializable. Luego, cada vez que necesito crear un DataObject, lo hago: nuevo DataObject (nuevo DragDropDataWrapper (datos)). En el lado desplegable, ahora puedo recuperar mis datos usando DataFormat.Serializable, que es reconocible por COM.
Tuve que arreglar otras cosas menores para que el ejemplo funcionara, es decir, administrar el caso cuando DragInfo es nulo.
Si comprueba el ejemplo de BoundTree, ahora debería funcionar en aplicaciones cruzadas.
CrossApplicationDragDropFix.zip

¿Fue útil esta página
0 / 5 - 0 calificaciones