8

バックグラウンド

4.0フレームワークでVB.NETアプリケーションを構築しました。主な機能の一部は、組み込みのAxWMPLib.AxWindowsMediaPlayerです。これにより、ファイルパスをURLとしてプレーヤーに渡し、組み込みのメディアプレーヤーで再生できます。私の開発プラットフォームは、Windows7上のVS2010Proです。

問題

最近、このアプリケーションを複数のOSでテストするようになりました。アプリケーションは、複数のwin7マシンのWin 7で正常に動作しますが、開発に使用されるものと使用されないものがあります。問題は、Vistaでアプリケーションを実行するときです。アプリケーションが開かれた後にファイルを初めて再生しようとすると、エラーがスローされます

ここに画像の説明を入力してください

これはほとんどの場合に行われますが、常にではありません。エラーが発生しない数回はパターンを確立できませんでした。さらに、これは最初のファイルに対してのみ実行され、後続のファイルに対しては実行されません。そして、それはエラー処理のためのTrycatchsを回避します。

リサーチ

私はこの問題についてかなりの研究をしました。他のメディアプレーヤーやWebサイト、さらには一部のマシンのWMPを悩ませているようです。特定のWindowsKBアップデートを指摘している記事もあれば、不良の可能性のあるdllを修復するために修復ディスクを実行することを提案している記事もあります。テストする必要のある2台の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コントロールの1つからスローされた場合は、プレビューまたは狙撃する可能性があります。可能であれば、コードを介してこれを処理したいと思います。誰かがこの特定のエラーに関する追加情報も持っている場合は、それも歓迎されます。

解像度

情報を提供してくれたjornareの功績を称え、正しい方向に進んでいきます。私の解決策と、その背後にあるコードについて説明します。お役に立てば幸いです。

まず、いくつかの明確な方法で、推奨される回答を変更する必要がありました。次の2行は、上記のplaySelectedメソッドを呼び出すクラスで宣言されています。

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

SEM_FAILCRITICALERRORSという名前のConst変数が追加されていることがわかります。これは、変数の値を1に設定するために必要です。この場合、変数の名前は、SetErrorModeメソッドのフラグ変数名と一致するため非常に具体的です。 trueに設定すると、このフラグはCriticalErrorsの表示を無効にします。必要ではないかもしれませんが、Lib呼び出しに.dllextも追加しました。

以下は私の新しい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

今これは重要です!最初に、ctlcontrols.play呼び出しの後に、SetErrorModeをoldErrModeに戻しましたが、これでエラーが防止されなかったことがわかりました。win7マシンでVSをデバッグモードに設定し、コードを1行ずつステップ実行しました。サブが終了するまで、コードが実際にファイルを再生しようとしなかったことがわかりました。これが、タイマー呼び出しが表示される理由です。エラーモードを正しく設定して再生プロセスを開始できるように、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

これについて最後に注意しておきます。このプロセスでは、重大なエラーの表示が無効になるため、注意してください。私の場合、スローされたエラーによって引き起こされた特定のエラーやシステムの不安定性を見つけることができなかったため、プログラムの使いやすさを向上させるために一時的に無効にします。システムエラーが発生するたびにこれを行うことはお勧めしません。そのエラーは、修正する必要のあるプログラムの欠陥/バグを示しているためです。さらに、私の意見では、重大なエラーを永続的にオフにする必要はありません。つまり、完了したら必ずオンに戻す必要があります。この情報が、質問に回答または賛成した人々の時間と知識に役立ち、感謝することを願っています。

4

1 に答える 1

2

私がネット上で見つけたものから、それは欠陥のあるWMPプラグイン、コーデック、またはディスプレイドライバが原因である可能性があります。また、WMPがメディアファイルのロードを開始する前に、Windows API関数SetErrorMode(SEM_FAILCRITICALERRORS)を呼び出すことで、このエラーを抑制できるはずであることがわかりました。

したがって、Vbの場合は次のようになります。

'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 )

私はこれをテストしていませんので、これが役立つかどうか教えてください。

于 2012-04-15T19:22:57.250 に答える