Vista Excepción en la aplicación .NET "Mensaje de procesamiento de excepciones"
Antecedentes
He creado una aplicación VB .NET en el Framework 4.0, parte de la funcionalidad principal está integrada en AxWMPLib.AxWindowsMediaPlayer que nos permite pasar una ruta de archivo como una URL para el jugador y luego reproducirlo a través del reproductor multimedia incorporado. Mi plataforma de desarrollo es VS 2010 Pro en Windows 7.Problema
Recientemente hemos pasado a probar esta aplicación en varios sistemas operativos. La aplicación funciona bien en Win 7 en varias máquinas win7, algunas utilizadas para desarrollo otras no. El problema es cuando ejecutamos la aplicación en Vista. la primera vez que la aplicación intenta reproducir un archivo después de que se haya abierto que generará un errorPara ello, la mayoría de las veces, pero no siempre, y no he sido capaz de establecer una patrón por las pocas veces que no ha arrojado el error. Además, solo hace esto para el primer archivo que reproduce, no para los archivos posteriores. Y elude las capturas de prueba para el manejo de errores.
Investigación
He hecho una buena investigación sobre este tema. He descubierto que parece afectar a otros reproductores multimedia y sitios web, incluso a WMP en algunas máquinas. Algunos artículos apuntan a actualizaciones específicas de Windows KB, otros sugieren ejecutar un disco de reparación para reparar dlls potencialmente malos. He intentado muchos de estos sin éxito, ya que el problema persiste en las dos máquinas Vista que tengo que probar.Código
aquí es el método que se llama cuando se produce este errorPublic 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
Propósito
Tengo la esperanza de encontrar una manera de manejar esta excepción a través del código, la vista previa potencial o francotiradores que si se trata de siendo arrojado desde uno de los controles .NET que estoy usando. Prefiero manejar esto a través de un código si es posible. Si alguien también tiene información adicional sobre este error específico, también sería bienvenido.Resolución
Con el crédito a jornare de la información y empujar en la dirección correcta voy a explicar mi resolución, y el código detrás de él más adelante, espero que ayude.
Primero tuve que modificar la respuesta recomendada, de varias formas distintas. Las siguientes dos líneas se declaran en la clase que llama al método playSelected anterior.
Public Declare Function SetErrorMode Lib "kernel32.dll" (ByVal uMode As System.UInt32) As System.UInt32
Private Const SEM_FAILCRITICALERRORS As System.UInt32 = &H1
verá la adición de las variables SEM_FAILCRITICALERRORS Const con nombre, esto es necesario para establecer el valor de la variable a 1, en este caso el nombre de la variable es muy específico ya que coincide con una bandera var nombre en el método SetErrorMode, cuando se establece en verdadero este indicador desactiva CriticalErrors para que no se muestre. También agregué .dll ext a la llamada Lib, aunque puede que no sea necesario.
A continuación es mi nuevo método 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
ahora esto es importante! Inicialmente, establecí SetErrorMode en el oldErrMode después de la llamada a ctlcontrols.play, pero encontré que esto no evitaba el error. Configuré mi VS en modo de depuración en mi máquina win7 y puse el código línea por línea. Descubrí que el código en realidad no intentaba reproducir el archivo hasta después de que terminara el sub. Es por eso que ves las llamadas del temporizador.Configuré un temporizador de 2 segundos para proporcionarme un buffer para poder comenzar el proceso de reproducción con el Modo de Error configurado correctamente. a continuación está el código que utilicé para el evento del temporizador transcurrido
'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
Una última advertencia que daré para esto. A mi entender, este proceso impide que se muestren errores críticos, así que tenga cuidado, en mi caso no pude encontrar ningún error específico o inestabilidad del sistema causada por el error lanzado, por lo que deshabilito temporalmente esto para agregar a la usabilidad del programa. No recomiendo hacer esto cada vez que tenga un error del sistema, ya que con frecuencia ese error apunta a una falla/error en el programa que se debe corregir. Además, en mi opinión, nunca debería tener que desactivar los errores críticos de forma permanente, lo que significa que debe volver a encenderlos cuando haya terminado. Espero que esta información ayude y aprecie el tiempo y el conocimiento de quienes respondieron o votaron la pregunta.
+1 para establecer su investigación =) –
Solo para estar seguro: ¿está diciendo que este Try/Catch no * capta la excepción? – egrunin
correcto, este error ocurre independientemente de mi try/catch. – Madullah