Исключение Vista в приложении .NET «Сообщение об обработке исключений»

Предыстория

Я создал приложение VB .NET на платформе 4.0 Framework, частью основной функциональности является встроенный AxWMPLib.AxWindowsMediaPlayer, который позволяет нам передавать путь к файлу как URL-адрес проигрывателя, а затем воспроизведите его через встроенный медиаплеер. Моя платформа разработки — VS 2010 Pro в Windows 7.

Проблема

Недавно мы перешли к тестированию этого приложения на нескольких ОС. Приложение отлично работает на Win 7 на нескольких машинах с Win7, некоторые из которых используются для разработки, а другие нет. Проблема в том, когда мы запускаем приложение в Vista. в самый первый раз, когда приложение попытается воспроизвести файл после его открытия, оно выдаст ошибку

enter image description here

Он делает это в большинстве случаев, но не всегда, и мне не удалось установить закономерность в тех немногих случаях, когда он не выдавал ошибку. Кроме того, он делает это только для первого воспроизводимого файла, а не для последующих файлов. И он ускользает от Try catch для обработки ошибок.

Исследования

Я провел немало исследований по этому вопросу. Я обнаружил, что это мешает другим медиаплеерам и веб-сайтам, даже WMP на некоторых машинах. В некоторых статьях указываются конкретные обновления базы знаний Windows, в других предлагается запустить ремонтный диск для восстановления потенциально поврежденных библиотек DLL.Я пробовал многие из них безуспешно, так как проблема сохраняется на двух машинах с Vista, с которыми я тестировал.

Код

вот метод, который вызывается при возникновении этой ошибки
Public Sub playSelected(ByVal fileStr As String)
    If File.Exists(fileStr) Then
        Debugging.DebugPrint(" Play: " & fileStr)
        MediaPlayer.URL = fileStr
        Try
            MediaPlayer.Ctlcontrols.play()
        Catch ex As Exception
            MessageBox.Show("Could Not play the selected File please try again.  Exception : " + ex.Message)
        End Try
    Else
        Debugging.DebugPrint(" File Does not Exist: " & fileStr)
    End If 
End Sub

Цель

Я надеюсь найти способ обработки этого исключения с помощью кода, потенциального предварительного просмотра или исключения его, если оно вызывается одним из элементов управления .NET, которые я использую. Я бы предпочел справиться с этим с помощью кода, если это возможно. Если у кого-то также есть дополнительная информация об этой конкретной ошибке, это также будет приветствоваться.

Решение

Благодаря jornare за информацию и толчок в правильном направлении, я объясню свое решение и код ниже, надеюсь, что это поможет.

Сначала мне пришлось изменить рекомендуемый ответ несколькими различными способами. Следующие две строки объявлены в классе, который вызывает описанный выше метод playSelected.

Public Declare Function SetErrorMode Lib "kernel32.dll" (ByVal uMode As System.UInt32) As System.UInt32
Private Const SEM_FAILCRITICALERRORS As System.UInt32 = &H1

вы увидите добавленную переменную Const с именем SEM_FAILCRITICALERRORS, это необходимо для установки значения переменной в 1, в этом случае имя переменной очень специфично, так как оно соответствует имени переменной флага в SetErrorMode метод, если для этого флага установлено значение true, он отключает отображение CriticalErrors. Я также добавил расширение .dll к вызову Lib, хотя это может и не понадобиться.

Ниже мой новый метод playSelected

Public Sub playSelected(ByVal fileStr As String)
    If File.Exists(fileStr) Then
        If isVista Then
            oldErrMode = SetErrorMode(SEM_FAILCRITICALERRORS)
        End If
        Debugging.DebugPrint(" Play: " & fileStr)
        MediaPlayer.URL = fileStr
        Try
            MediaPlayer.Ctlcontrols.play()
        Catch ex As Exception
            MessageBox.Show("Could Not play the selected File please try again.  Exception : " + ex.Message)
        End Try
        If isVista Then
            criticalFailureTimer.Interval = 2000
            criticalFailureTimer.AutoReset = False
            criticalFailureTimer.Start()
        End If
    Else
        Debugging.DebugPrint(" File Does not Exist: " & fileStr)
    End If

End Sub

теперь это важно! Первоначально я установил ErrorMode обратно в oldErrMode после вызова ctlcontrols.play, но обнаружил, что это не предотвратило ошибку. Я установил свой VS в режим отладки на моей машине с Win7 и прошел код построчно.Я обнаружил, что код на самом деле не пытался воспроизвести файл до тех пор, пока не закончилась подпрограмма. Вот почему вы видите вызовы таймера. Я установил 2-секундный таймер, чтобы дать себе буфер, чтобы он мог начать процесс воспроизведения с правильно установленным режимом ошибки. ниже приведен код, который я использовал для события истечения таймера

'in my Constructor
If My.Computer.Info.OSFullName.Contains("Vista") Then
    isVista = True
    AddHandler criticalFailureTimer.Elapsed, AddressOf criticalTimerExpired
End If
'end of Constructor portion

Private Sub criticalTimerExpired(sender As Object, e As ElapsedEventArgs)
    SetErrorMode(oldErrMode)
End Sub

. Последнее предостережение, которое я дам по этому поводу. Насколько я понимаю, этот процесс отключает отображение критических ошибок, поэтому будьте осторожны, в моем случае я не смог найти какой-либо конкретной ошибки или нестабильности системы, вызванной возникшей ошибкой, поэтому я временно отключил это, чтобы повысить удобство использования программы. Я не рекомендую делать это каждый раз, когда у вас возникает системная ошибка, так как часто эта ошибка указывает на недостаток/ошибку в программе, которую следует исправить. Кроме того, на мой взгляд, вам никогда не нужно постоянно отключать критические ошибки, а это означает, что вы должны включить их снова, когда закончите. Я надеюсь, что эта информация поможет, и ценю время и знания тех, кто ответил или проголосовал за вопрос.

8
задан Mabdullah 24 April 2014 в 20:37
поделиться