Gong-wpf-dragdrop: Arrastar dados entre duas instâncias do aplicativo causa exceção inválida de tymed (exceção de HRESULT: 0x80040069 (DV_E_TYMED))

Criado em 18 fev. 2013  ·  3Comentários  ·  Fonte: punker76/gong-wpf-dragdrop

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

Quais passos vão reproduzir o problema?

  1. Implemente IDragSource.
  2. Comece a arrastar os dados (linha do datagrid wpf no meu caso)
  3. Adicionar clone de dados definidos pelo usuário ao objeto IDragInfo.Data em StartDrag.
  4. Arraste sobre o mesmo datagrid na segunda instância do aplicativo.

Qual é o resultado esperado?

A saída esperada seriam os dados clonados adicionados ao datagrid. Nos eventos DragOver e Drop, eu lidaria com quaisquer problemas de dados. No entanto, nunca cheguei tão longe porque a exceção inválida tymed (exceção de HRESULT: 0x80040069 (DV_E_TYMED)) é gerada pelo O / S na linha 135 em GongSolutions.Wpf.DragDrop.DropInfo.cs (o código é Data = (e. Data.GetDataPresent (dataFormat))? E.Data.GetData (dataFormat): e.Data;).

Qual versão do produto que você está usando?
0.1.3 (versão de montagem) - eu construí a partir da fonte
Windows XP

Por favor, forneça quaisquer informações adicionais abaixo.

Os detalhes da exceção seguem:

System.Runtime.InteropServices.COMException não foi tratada pelo código do usuário
Mensagem = inválido digitado (exceção de HRESULT: 0x80040069 (DV_E_TYMED))
Source = mscorlib
ErrorCode = -2147221399
StackTrace:
em System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal (Int32 errorCode, IntPtr errorInfo)
em System.Runtime.InteropServices.Marshal.ThrowExceptionForHR (Int32 errorCode)
em System.Windows.DataObject.System.Runtime.InteropServices.ComTypes.IDataObject.GetData (FORMATETC e formatetc, STGMEDIUM e meio)
em System.Runtime.InteropServices.ComTypes.IDataObject.GetData (FORMATETC e formato, STGMEDIUM e meio)
em System.Windows.DataObject.OleConverter.GetDataInner (FORMATETC e formatetc, STGMEDIUM e meio)
em System.Windows.DataObject.OleConverter.GetDataFromOleHGLOBAL (formato de string, aspecto DVASPECT, índice Int32)
em System.Windows.DataObject.OleConverter.GetDataFromBoundOleDataObject (formato de string, aspecto DVASPECT, índice Int32)
em System.Windows.DataObject.OleConverter.GetData (formato String, Boolean autoConvert, aspecto DVASPECT, índice Int32)
em System.Windows.DataObject.OleConverter.GetData (String format, Boolean autoConvert)
em System.Windows.DataObject.GetData (String format, Boolean autoConvert)
em System.Windows.DataObject.GetData (formato String)
em GongSolutions.Wpf.DragDrop.DropInfo..ctor (Object sender, DragEventArgs e, DragInfo dragInfo)
em GongSolutions.Wpf.DragDrop.DragDrop.DropTarget_PreviewDragOver (Object sender, DragEventArgs e)
em GongSolutions.Wpf.DragDrop.DragDrop.DropTarget_PreviewDragEnter (Object sender, DragEventArgs e)
em System.Windows.DragEventArgs.InvokeEventHandler (Delegate genericHandler, Object genericTarget)
em System.Windows.RoutedEventArgs.InvokeHandler (Delegate handler, Object target)
em System.Windows.RoutedEventHandlerInfo.InvokeHandler (Object target, RoutedEventArgs routedEventArgs)
em System.Windows.EventRoute.InvokeHandlersImpl (Fonte do objeto, argumentos RoutedEventArgs, Boolean reRaised)
em System.Windows.UIElement.RaiseEventImpl (DependencyObject sender, RoutedEventArgs args)
em System.Windows.UIElement.RaiseEvent (RoutedEventArgs e)
em System.Windows.OleDropTarget.RaiseDragEvent (RoutedEvent dragEvent, Int32 dragDropKeyStates, Int32 & efeitos, DependencyObject target, Point targetPoint)
em System.Windows.OleDropTarget.MS.Win32.UnsafeNativeMethods.IOleDropTarget.OleDragOver (Int32 dragDropKeyStates, Int64 point, Int32 e efeitos)
InnerException:

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

Bug Imported from google code

Comentários muito úteis

Eu enfrentei o problema de exceção DV_E_TYMED em um aplicativo que estou desenvolvendo e gostaria de compartilhar a solução que encontrei. Em anexo, você encontra os arquivos do seu projeto que modifiquei para corrigir o problema.
Basicamente, ao arrastar objetos de um aplicativo para outro, você precisa usar COM e COM requer que os objetos sejam serializáveis ​​para serem trocados corretamente.
Ao usar o DataObject, você não pode simplesmente passar um DataFromat que você criou, porque o COM não saberá nada sobre ele. Em vez disso, criei uma classe de wrapper (DragDropDataWrapper) que está marcada como [Serializable] e implementa ISerializable. Então, toda vez que eu preciso criar um DataObject eu faço: new DataObject (new DragDropDataWrapper (data)). Agora, posso recuperar meus dados usando DataFormat.Serializable, que é COM reconhecível.
Tive que consertar outras coisas menores para fazer o exemplo funcionar, ou seja, gerenciar o caso em que DragInfo é nulo.
Se você verificar o exemplo BoundTree, agora ele deve funcionar em aplicações cruzadas.
CrossApplicationDragDropFix.zip

Todos 3 comentários

_De cheaster ... @ gmail.com em 07 de dezembro de 2010 15: 25: 00_
Um pouco mais de informação ....

Parece que o verdadeiro problema é quando eu defino o IDragInfo.Data como um objeto System.Windows.DataObject. Estou anexando um aplicativo de amostra para demonstrar o problema.

Para ver o erro, execute as seguintes etapas. Execute duas instâncias do aplicativo, tente arrastar um item da caixa de listagem entre as duas instâncias.

Estou usando um DataObject porque também preciso permitir o descarte de arquivos no sistema operacional.

_De fahad ... @ gmail.com em 24 de agosto de 2011 20: 46: 51_
Adicione sua voz aqui 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- arrastando

Eu enfrentei o problema de exceção DV_E_TYMED em um aplicativo que estou desenvolvendo e gostaria de compartilhar a solução que encontrei. Em anexo, você encontra os arquivos do seu projeto que modifiquei para corrigir o problema.
Basicamente, ao arrastar objetos de um aplicativo para outro, você precisa usar COM e COM requer que os objetos sejam serializáveis ​​para serem trocados corretamente.
Ao usar o DataObject, você não pode simplesmente passar um DataFromat que você criou, porque o COM não saberá nada sobre ele. Em vez disso, criei uma classe de wrapper (DragDropDataWrapper) que está marcada como [Serializable] e implementa ISerializable. Então, toda vez que eu preciso criar um DataObject eu faço: new DataObject (new DragDropDataWrapper (data)). Agora, posso recuperar meus dados usando DataFormat.Serializable, que é COM reconhecível.
Tive que consertar outras coisas menores para fazer o exemplo funcionar, ou seja, gerenciar o caso em que DragInfo é nulo.
Se você verificar o exemplo BoundTree, agora ele deve funcionar em aplicações cruzadas.
CrossApplicationDragDropFix.zip

Esta página foi útil?
0 / 5 - 0 avaliações