2012-04-05 11 views
8

.NET अनुप्रयोग "अपवाद प्रसंस्करण संदेश" में Vista अपवाद

पृष्ठभूमि

मैंने 4.0 फ्रेमवर्क पर एक वीबी .NET अनुप्रयोग बनाया है, प्राथमिक कार्यक्षमता का हिस्सा AXWMPLib.AxWindowsMediaPlayer में बनाया गया है जो हमें फ़ाइल पथ पास करने की अनुमति देता है प्लेयर के लिए एक यूआरएल के रूप में और फिर इसे निर्मित मीडिया प्लेयर के माध्यम से खेलते हैं। मेरा विकास प्लेटफार्म विंडोज 7 पर वीएस 2010 प्रो है।

समस्या

हम हाल ही में कई ओएस पर इस एप्लिकेशन का परीक्षण करने के लिए चले गए हैं। एप्लिकेशन कई Win7 मशीनों पर विन 7 पर ठीक चलता है, कुछ दूसरों के विकास के लिए उपयोग नहीं किया जाता है। समस्या तब होती है जब हम Vista पर एप्लिकेशन चलाते हैं। बहुत पहले समय के आवेदन के बाद यह खोल दिया गया है यह एक त्रुटि

फेंक होगा किसी फ़ाइल को चलाने की कोशिश करता है यह करता है इस बार के बहुमत, लेकिन हमेशा नहीं, और मैं एक स्थापित करने में असमर्थ किया गया है पैटर्न ने कुछ बार त्रुटि को फेंक दिया नहीं है। इसके अतिरिक्त, यह केवल पहली फ़ाइल के लिए करता है जो इसे बाद की फ़ाइलों के लिए नहीं चलाता है। और यह eludes त्रुटि हैंडलिंग के लिए पकड़ने की कोशिश करो।

अनुसंधान

मैंने इस मुद्दे पर एक अच्छा शोध किया है। मुझे लगता है कि यह कुछ मीडिया प्लेयरों और वेबसाइटों को पीड़ित करता है, यहां तक ​​कि कुछ मशीनों पर डब्लूएमपी भी। कुछ लेख विशिष्ट विंडोज केबी अपडेट को इंगित करते हैं, अन्य संभावित संभावित खराब डीएल की मरम्मत के लिए मरम्मत डिस्क चलाने का सुझाव देते हैं। मैंने इनमें से कई असफल प्रयास किए हैं, क्योंकि यह समस्या दो विस्टा मशीनों पर बनी हुई है जिनके साथ मुझे परीक्षण करना है।

कोड

यहाँ विधि है जब यह त्रुटि आती

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 विधि में नाम, जब यह ध्वज सही पर सेट किया जाता है तो क्रिटिकल एरर को दिखने से अक्षम करता है। मैंने लिब कॉल में .dll ext भी जोड़ा, हालांकि यह आवश्यक नहीं हो सकता है।

नीचे मेरी नई 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 कॉल के बाद oldErrMode पर SetErrorMode वापस चला गया, लेकिन पाया कि इससे त्रुटि को रोका नहीं गया है। मैंने अपनी वीएस 7 मशीन पर डीबग मोड में अपना वीएस सेट किया और लाइन लाइन के माध्यम से लाइन लाइन के माध्यम से कदम रखा। मैंने पाया कि वास्तव में कोड समाप्त होने के बाद फ़ाइल को चलाने की कोशिश नहीं करता था। यही कारण है कि आप टाइमर कॉल देखते हैं।मैंने खुद को एक बफर देने के लिए 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 

एक आखिरी चेतावनी मैं इसके लिए दूंगा। मेरी समझ के लिए यह प्रक्रिया गंभीर त्रुटियों को प्रदर्शित होने से अक्षम करती है, इसलिए सावधान रहें, मेरे मामले में मैं त्रुटि के कारण किसी भी विशिष्ट त्रुटि या सिस्टम अस्थिरता को खोजने में असमर्थ था, इसलिए मैं प्रोग्राम की प्रयोज्यता में अस्थायी रूप से इसे अक्षम करने के लिए अक्षम करता हूं। मैं हर बार ऐसा करने की अनुशंसा नहीं करता हूं जब आपके पास सिस्टम त्रुटि हो, अक्सर त्रुटि उस प्रोग्राम में त्रुटियों/बग को इंगित करती है जिसे ठीक किया जाना चाहिए। इसके अतिरिक्त, मेरी राय में आपको कभी भी गंभीर त्रुटियों को स्थायी रूप से बंद करने की आवश्यकता नहीं है, जिसका अर्थ यह सुनिश्चित करना है कि जब आप पूरा कर लेंगे तो आप उन्हें वापस चालू कर दें। मुझे आशा है कि यह जानकारी उन लोगों के समय और ज्ञान की सहायता और सराहना करेगी जिन्होंने प्रश्न का उत्तर दिया या वोट दिया था।

+3

अपने शोध बताते हुए के लिए +1 =) –

+0

बस सुनिश्चित करने के लिए: आप कह रहे हैं कि इस ट्राई/कैच करता है * नहीं * अपवाद को पकड़ने? – egrunin

+0

सही, यह त्रुटि मेरी कोशिश/पकड़ से स्वतंत्र होती है। – Madullah

उत्तर

2

जो मुझे नेट पर मिलता है उससे यह एक दोषपूर्ण डब्लूएमपी प्लगइन, कोडेक या डिस्प्ले ड्राइवरों के कारण हो सकता है। डब्लूएमपी मीडिया फ़ाइल लोड करना शुरू करने से पहले आपको 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) 

मैं इस परीक्षण नहीं किया है, इसलिए मुझे पता है कि अगर यह मदद करता है।

+0

बस एक सिर के रूप में, मुझे विश्वास है कि यह विचार काम कर रहा है/काम करेगा। मुझे कुछ चीजों को ट्विक करना पड़ा है, और मैं अभी भी इस पर काम कर रहा हूं, मैं क्रेडिट दे दूंगा और अपना अंतिम जवाब पोस्ट करूँगा जब मैं इसे काम कर रहा हूं, तो आपको रेडियो मौन नहीं देना चाहता था, मदद के लिए धन्यवाद। – Madullah

+0

इसे SetErrorMode विधि का उपयोग करके प्रोग्रामेटिक रूप से काम कर रहा है, भविष्य में कोई भी ज्ञान शोधकर्ता मेरे विवरण में संकल्प अनुभाग देखता है। – Madullah

+0

स्वीट :) मदद करने में खुशी हुई – jornare