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