2012-04-05 14 views
8

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 error

Para 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 error

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 

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.

+3

+1 para establecer su investigación =) –

+0

Solo para estar seguro: ¿está diciendo que este Try/Catch no * capta la excepción? – egrunin

+0

correcto, este error ocurre independientemente de mi try/catch. – Madullah

Respuesta

2

De lo que encuentro en la red podría ser causado por un complemento WMP, codek o controladores de pantalla defectuosos. También descubrió que debería poder suprimir este error llamando a la función API de Windows SetErrorMode (SEM_FAILCRITICALERRORS) antes de que WMP comience a cargar el archivo multimedia.

Así, por Vb algo como:

'declare 
Private Declare Function SetErrorMode Lib "kernel32" (ByVal wMode As Long) As Long 

'call it 
Dim oldErrMode As Long 
oldErrMode = SetErrorMode(SEM_FAILCRITICALERRORS) 

'Do your stuff here 

'Set it back 
SetErrorMode(oldErrMode) 

no he probado esto, así que me haga saber si esto ayuda.

+0

Al igual que un aviso, creo que esta idea está funcionando/funcionará. Tuve que modificar algunas cosas, y todavía estoy trabajando en eso, daré crédito y publicaré mi respuesta final una vez que la tenga funcionando, no quise darle un silencio de radio, gracias por la ayuda. – Madullah

+0

lo tengo trabajando programáticamente, usando el método SetErrorMode, cualquier buscador de conocimiento futuro puede ver la sección Resolución en mi descripción. – Madullah

+0

Sweet :) Me alegra ayudar – jornare

Cuestiones relacionadas