2015-12-04 2 views
1

Это не сбой, все исключения, о которых я упоминаю здесь, можно увидеть только в окне вывода Visual Studio. Вот реализация Перетаскивания:
WPF:Что может вызвать COMExceptions при перетаскивании файла поверх рабочего стола?

<StackPanel Orientation="Vertical" 
      MouseDown="DragShortcut" 
      x:Name="Shortcut"> 
    <Image Source="{Binding Icon}"/> 
    <Label Content="{Binding ShortcutLabel}"/> 
</StackPanel> 

CS код:

private void DragShortcut(object sender, MouseButtonEventArgs e) 
{ 
    if (e.LeftButton != MouseButtonState.Pressed) 
     return; 

    var dataObject = new DataObject(DataFormats.FileDrop, new[] { Options.DragDropOptions.ShortcutPath }); 
    DragDrop.DoDragDrop(Shortcut, dataObject, DragDropEffects.Copy); 
} 

Все, кажется, работает, как ожидался, но каждый раз, когда я перетащить что-то над моим рабочим столом или окнами проводника я получаю следующие сообщения в окне «Выходные данные» моей Visual Studio:

... 
A first chance exception of type 'System.Runtime.InteropServices.COMException' occurred in PresentationCore.dll 
A first chance exception of type 'System.Runtime.InteropServices.COMException' occurred in PresentationCore.dll 
A first chance exception of type 'System.Runtime.InteropServices.COMException' occurred in PresentationCore.dll 
A first chance exception of type 'System.Runtime.InteropServices.COMException' occurred in PresentationCore.dll 
A first chance exception of type 'System.NotImplementedException' occurred in PresentationCore.dll 
A first chance exception of type 'System.Runtime.InteropServices.COMException' occurred in PresentationCore.dll 
... 

Когда Visual Studio настроена на остановку на этом excep ЦИИ, можно увидеть следующие исключения:

System.Runtime.InteropServices.COMException was unhandled 
Message: An exception of type 'System.Runtime.InteropServices.COMException' occurred in PresentationCore.dll and wasn't handled before a managed/native boundary 
Additional information: Invalid FORMATETC-Structure (Exception HRESULT: 0x80040064 (DV_E_FORMATETC)) 

и

System.NotImplementedException was unhandled 
Message: An exception of type 'System.NotImplementedException' occurred in PresentationCore.dll and wasn't handled before a managed/native boundary 
Additional information: The method or operation is not implemented. 

Это не приводит к аварии или что-нибудь, это просто неудобно для меня, как разработчик, чтобы иметь такую ​​вещь происходит в фоновом режиме , Кто-нибудь имеет Идею, что это может быть?

EDIT:
This проблема очень похожа на мою, но, похоже, имеет другую причину и решение.

+0

Возможный дубликат [Как избежать System.Runtime.InteropServices.COMException?] (Http://stackoverflow.com/questions/4281425/how-to-avoid-a-system-runtime-interopservices-comexception) – TheLethalCoder

+0

@TheLethalCoder исключение похоже, хотя в моем случае у него, похоже, другая причина. – dmigo

ответ

4

Это совершенно нормально. Независимо от того, какое окно другого процесса вы перетаскиваете, этот процесс перетаскивает объект, который вы перетаскиваете, чтобы увидеть, поддерживает ли он конкретный формат или может преобразовать объект в другой формат. Сделано с COM calls под капотом. Если ответ «да», вы увидите, что изменение курсора означает, что вы можете отказаться.

Реализация интерфейса IDataObject в WPF говорит «нет» путем выброса исключения. Обычный способ, в котором коды сбоя COM генерируются в .NET-программе. Это исключение преобразуется CLR в код ошибки COM, HRESULT, чтобы сообщить процессу, что он не будет работать. Обратите внимание, что класс Exeption имеет HResult property, вот что видит процесс.

Отладчик добросовестно отображает уведомление об исключении «первого шанса», если вы его попросите. Щелкните правой кнопкой мыши окно «Выход», «Исключительные сообщения», включенный по умолчанию. Ничто на самом деле не ошибается, исключение ловят и обрабатывают изящно. Особенность, а не ошибка.

Смежные вопросы