Как перетащить и отбросить систему__ComObject - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь использовать перетаскивание изображений между двумя программами. В приложении-отправителе

Private Sub PictureBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown
        If e.Button = Windows.Forms.MouseButtons.Left Then
            Dim drop_effect As DragDropEffects = PictureBox1.DoDragDrop(PictureBox1.Image, DragDropEffects.Copy)
        End If
    End Sub

И в приложении-получателе

Private Sub PictureBox1_DragEnter(sender As Object, e As DragEventArgs) Handles PictureBox1.DragEnter
        If e.Data.GetDataPresent(DataFormats.Bitmap, True) Then
            e.Effect = DragDropEffects.Copy
        ElseIf e.Data.GetDataPresent(DataFormats.FileDrop) Then
            e.Effect = DragDropEffects.Copy
        End If
    End Sub

Private Sub PictureBox1_DragDrop(sender As Object, e As DragEventArgs) Handles PictureBox1.DragDrop
    If e.Data.GetDataPresent(DataFormats.Bitmap) Then
        PictureBox1.Image =DirectCast(e.Data.GetData(DataFormats.Bitmap), Image)
    ElseIf e.Data.GetDataPresent(DataFormats.FileDrop) Then
        Dim files() As String = DirectCast(e.Data.GetData(DataFormats.FileDrop), String())
        Dim Bait = My.Computer.FileSystem.ReadAllBytes(files(0))
    End If
End Sub

Остановка отбрасывания с длинным сообщением

System.InvalidCastException: 'Невозможно привести объект COM к введите 'System .__ ComObject' к типу класса 'System.Drawing.Image'. Экземпляры типов, которые представляют компоненты COM, не могут быть преобразованы в типы, которые не представляют компоненты COM; однако их можно приводить к интерфейсам, если базовый компонент COM поддерживает вызовы QueryInterface для IID интерфейса. '

Я нашел много примеров в inte rnet и попробовал их. Те, кто прошел компиляцию, дали ту же ошибку. Вариант, который я попробовал, состоял в том, чтобы изменить прямой бросок, чтобы попробовать бросок или вообще не бросать. Пожалуйста, помогите и используйте VB.

1 Ответ

0 голосов
/ 09 января 2020

При просмотре исходного кода для класса DataObject становится очевидно, что этот класс предназначен для обработки экземпляров IDataObject на основе COM. Чтобы получить доступ к этой способности, вам нужно создать новый экземпляр DataObject и передать IDataObject, предоставленный DragEventArgs.

Из Раздел примечаний документации DataObject (Object) :

Вы можете добавить данные в любом формате в объект DataObject при использовании этого конструктора или добавить данные в качестве объекта IDataObject для одновременного предоставления нескольких форматов. Если вы знакомы с программированием COM, вы также можете добавить объект данных, который реализует интерфейс COM IDataObject.

С этой информацией ваш обработчик отбрасывания может быть переписан следующим образом:

Private Sub PictureBox1_DragDrop(sender As Object, e As DragEventArgs) Handles PictureBox1.DragDrop
  Dim localDataObject As DataObject = New DataObject(e.Data)

  If localDataObject.ContainsImage Then
    PictureBox1.Image = localDataObject.GetImage
  ElseIf localDataObject.GetDataPresent(DataFormats.FileDrop) Then
    Dim files() As String = DirectCast(localDataObject.GetData(DataFormats.FileDrop), String())
    Dim bytes As Byte() = My.Computer.FileSystem.ReadAllBytes(files(0))
  End If
End Sub
...