2009-03-23 7 views
13

मैं System.Diagnostics.Process साथ एक बाहरी प्रक्रिया शुरू करने कर रहा हूँ। यह बैच नौकरी का हिस्सा है, इसलिए यदि एक प्रक्रिया दुर्घटनाग्रस्त हो जाती है, तो मैं इसे संभालना चाहता हूं और बाकी को जारी रखना चाहता हूं।कैसे एक प्रक्रिया के माध्यम से System.Diagnostics.Process का शुभारंभ में एक दुर्घटना को संभालने के लिए?

क्या वर्तमान में होता है विंडोज एक संवाद मुझे बता कि इस कार्यक्रम के दुर्घटनाग्रस्त हो गया है, और केवल एक बार मैं खारिज कर दिया है कि मैन्युअल प्रक्रिया से बाहर निकलें करता है पॉप अप होता है।

this question के अनुसार, प्रक्रिया। रिस्पॉन्डिंग प्रॉपर्टी केवल यूआई के साथ प्रोग्राम के लिए उपलब्ध है (जिस प्रक्रिया को मैं लॉन्च कर रहा हूं वह एक कंसोल ऐप है)।

मैं भी विभिन्न घटनाओं एक प्रक्रिया प्रदान करता है को देखा है, लेकिन उनमें से कोई भी दुर्घटनाग्रस्त पर निकाल दिया जाता है।

कोई भी विचार?

उत्तर

25

मूल्य DWORD 2 करने के लिए रजिस्ट्री मान निम्न रजिस्ट्री सेट करके देखें:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows\ErrorMode = 2 

इस मशीन पर हर प्रक्रिया को प्रभावित करेगा।

संदर्भ: How to Get Rid of System and Application Popup Messages

आप इस कार्यक्रम दुर्घटनाओं, आप सभी संरचित अपवाद को पकड़ने और संदेश बॉक्स पॉपिंग बिना निकल कर पॉपअप रोका जा सकता है के लिए स्रोत कोड है। आप यह कैसे करते हैं प्रोग्रामिंग भाषा पर निर्भर करता है।

आप स्रोत की जरूरत नहीं है, तो पैरेंट में SetErrorMode फ़ंक्शन का उपयोग पॉपअप को दबाने के लिए। त्रुटि मोड subprocesses द्वारा विरासत में मिला है। आप गलत पर UseShellExecute सेट इस काम करने के लिए चाहिए: "क्या आप चयनित डिबगर का उपयोग कर डिबग करने के लिए करना चाहते हैं"

using System; 
using System.Diagnostics; 
using System.Runtime.InteropServices; 


namespace SubProcessPopupError 
{ 

    class Program 
    { 
     [DllImport("kernel32.dll", SetLastError = true)] 
     static extern int SetErrorMode(int wMode); 

     static void Main(string[] args) 
     { 
      int oldMode = SetErrorMode(3); 
      Process p; 
      ProcessStartInfo ps = new ProcessStartInfo("crash.exe"); 
      ps.UseShellExecute = false; 
      p = Process.Start(ps); 
      SetErrorMode(oldMode); 
      p.WaitForExit(); 
     } 
    } 
} 

आप एक संवाद कह रही है, आपको लगता है कि बंद 0 को यह रजिस्ट्री मान सेट करके चालू कर सकते हैं

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Auto = 0 

हालांकि, मुझे नहीं लगता कि अगर आप ऊपर वर्णित अनुसार त्रुटि मोड 3 सेट कर चुके हैं तो यह नहीं होगा।

+0

की तरह इस काम करेगा लगता है, लेकिन यह एक तलवार का प्रयोग की तरह एक सा मक्खन फैलाने के लिए। इस कार्यक्रम को अन्य लोगों के कंप्यूटरों पर चलना होगा ताकि सिस्टम-व्यापी गुणों को बदलना एक विकल्प न हो :( – meatvest

+0

मेरे उत्तर में जोड़े गए अतिरिक्त अनुच्छेद को देखें। यदि आपके पास स्रोत कोड है ... सभी अपवादों को पकड़ें। –

+0

दुर्घटना जिसने मेरा प्रश्न वास्तव में प्रोग्राम के संदर्भों को लोड करने के दौरान किया था - मुख्य() विधि को भी दर्ज नहीं किया गया था - जिसका मतलब अपवाद था (जहां तक ​​मैं समझता हूं) पकड़ना असंभव था। – meatvest

0

एक अन्य विकल्प, cdb के तहत अपने निष्पादन योग्य चलाने के लिए, और उसके बाद शब्द "अपवाद" के लिए खोज करने के लिए निम्न आदेश पंक्ति का उपयोग कर रहा है:

cdb.exe -G -g -c "Q" <your executable> 
संबंधित मुद्दे