Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows .NET应用程序中的Vista异常;异常处理消息";_Windows_Exception_Windows Vista - Fatal编程技术网

Windows .NET应用程序中的Vista异常;异常处理消息";

Windows .NET应用程序中的Vista异常;异常处理消息";,windows,exception,windows-vista,Windows,Exception,Windows Vista,背景我在4.0框架上构建了一个VB.NET应用程序,主要功能的一部分是内置的AxWMPLib.AxWindowsMediaPlayer,它允许我们将文件路径作为URL传递给播放器,然后通过内置媒体播放器播放。我的开发平台是Windows 7上的VS 2010 Pro 问题我们最近开始在多个操作系统上测试这个应用程序。该应用程序在多台win7机器上的win7上运行良好,有些用于开发,有些不用于开发。问题是当我们在Vista上运行应用程序时。应用程序在打开文件后第一次尝试播放文件时,将抛出一个错误

背景我在4.0框架上构建了一个VB.NET应用程序,主要功能的一部分是内置的AxWMPLib.AxWindowsMediaPlayer,它允许我们将文件路径作为URL传递给播放器,然后通过内置媒体播放器播放。我的开发平台是Windows 7上的VS 2010 Pro

问题我们最近开始在多个操作系统上测试这个应用程序。该应用程序在多台win7机器上的win7上运行良好,有些用于开发,有些不用于开发。问题是当我们在Vista上运行应用程序时。应用程序在打开文件后第一次尝试播放文件时,将抛出一个错误

它大多数时候都会这样做,但并不总是这样,而且我一直无法建立一个模式,因为有几次它没有抛出错误。此外,它仅对播放的第一个文件执行此操作,而不对后续文件执行此操作。而且它避免了错误处理的Try捕获

我在这个问题上做了很多研究。我发现它似乎困扰着其他媒体播放器和网站,甚至一些机器上的WMP。一些文章指向特定的Windows KB更新,另一些文章建议运行修复盘来修复潜在的坏DLL。我已经尝试了很多,但都没有成功,因为这个问题在我必须测试的两台Vista机器上仍然存在

Codehere是发生此错误时调用的方法

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
您将看到添加了名为SEM_FAILCRITICALERRORS的常量变量,这是将变量的值设置为1所必需的,在这种情况下,变量的名称非常具体,因为它与SetErrorMode方法中的标志变量名称相匹配,当设置为true时,此标志将禁用CriticalErrors显示。我还将.dll ext添加到Lib调用中,尽管这可能不是必需的

下面是我新选择的播放方法

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调用后将ErrorMode设置回OldErrorMode,但发现这并不能阻止错误。我在win7机器上将VS设置为调试模式,并逐行遍历代码。我发现代码直到子文件结束后才真正尝试播放该文件。这就是为什么您会看到计时器调用。我设置了一个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

最后一个警告我会给这个。据我所知,这个过程禁止显示关键错误,因此请小心,在我的情况下,我无法找到由抛出的错误引起的任何特定错误或系统不稳定,因此我暂时禁用它以增加程序的可用性。我不建议每次出现系统错误时都这样做,因为该错误往往指向程序中应修复的缺陷/bug。此外,在我看来,您永远不需要永久关闭关键错误,这意味着确保在完成后重新打开它们。我希望这些信息有助于并感谢那些回答或投票支持该问题的人的时间和知识。

从我在网上的发现来看,这可能是由错误的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 )

我还没有测试过这个,所以让我知道这是否有帮助。

+1用于说明你的研究=)只是为了确定:你是说这个Try/Catch没有捕获异常吗?正确,这个错误的发生与我的Try/Catch无关。作为提醒,我相信这个想法是有效的/会有效的。我已经调整了一些东西,我仍在努力,一旦我的最终答案成功了,我将给予奖励并发布我的最终答案,我不想让你保持沉默,谢谢你的帮助。让它以编程方式工作,使用SetErrorMode方法,任何未来的知识寻求者都可以看到我描述中的解决部分。