.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
एक आखिरी चेतावनी मैं इसके लिए दूंगा। मेरी समझ के लिए यह प्रक्रिया गंभीर त्रुटियों को प्रदर्शित होने से अक्षम करती है, इसलिए सावधान रहें, मेरे मामले में मैं त्रुटि के कारण किसी भी विशिष्ट त्रुटि या सिस्टम अस्थिरता को खोजने में असमर्थ था, इसलिए मैं प्रोग्राम की प्रयोज्यता में अस्थायी रूप से इसे अक्षम करने के लिए अक्षम करता हूं। मैं हर बार ऐसा करने की अनुशंसा नहीं करता हूं जब आपके पास सिस्टम त्रुटि हो, अक्सर त्रुटि उस प्रोग्राम में त्रुटियों/बग को इंगित करती है जिसे ठीक किया जाना चाहिए। इसके अतिरिक्त, मेरी राय में आपको कभी भी गंभीर त्रुटियों को स्थायी रूप से बंद करने की आवश्यकता नहीं है, जिसका अर्थ यह सुनिश्चित करना है कि जब आप पूरा कर लेंगे तो आप उन्हें वापस चालू कर दें। मुझे आशा है कि यह जानकारी उन लोगों के समय और ज्ञान की सहायता और सराहना करेगी जिन्होंने प्रश्न का उत्तर दिया या वोट दिया था।
अपने शोध बताते हुए के लिए +1 =) –
बस सुनिश्चित करने के लिए: आप कह रहे हैं कि इस ट्राई/कैच करता है * नहीं * अपवाद को पकड़ने? – egrunin
सही, यह त्रुटि मेरी कोशिश/पकड़ से स्वतंत्र होती है। – Madullah