UseShellExecuteबूलियन संपत्ति खिड़कियों के उपयोग से संबंधित है ShellExecute समारोह बनाम CreateProcess समारोह - संक्षिप्त उत्तर है कि अगर है UseShellExecuteसच है तो Processवर्ग का उपयोग करेगा ShellExecuteसमारोह, अन्यथा यह प्रयोग करेंगे CreateProcess।
लंबा उत्तर यह है कि ShellExecuteफ़ंक्शन का उपयोग किसी निर्दिष्ट प्रोग्राम या फ़ाइल को खोलने के लिए किया जाता है - यह रन डायलॉग में निष्पादित होने के लिए कमांड टाइप करने और ओके पर क्लिक करने के लिए लगभग बराबर है, जिसका अर्थ है कि इसका उपयोग (उदाहरण के लिए) किया जा सकता है:
- उस ब्राउज़र के बारे में जानने की आवश्यकता के बिना डिफ़ॉल्ट ब्राउज़र का उपयोग करके .html फाइलें या वेब खोलें,
- वर्ड के लिए इंस्टॉलेशन पथ क्या है, यह जानने की आवश्यकता के बिना एक शब्द दस्तावेज़ खोलें
- पर कोई आदेश चलाएँ
PATH
उदाहरण के लिए:
Process p = new Process();
p.StartInfo.UseShellExecute = true;
p.StartInfo.FileName = "www.google.co.uk";
p.Start();
यह प्रयोग करने में बहुत आसान है, बहुमुखी और शक्तिशाली है, लेकिन कुछ कमियां भी हैं:
मानक इनपुट / आउटपुट / त्रुटि हैंडल को पुनर्निर्देशित करना संभव नहीं है
संभवतः बच्चे की प्रक्रिया के लिए सुरक्षा डिस्क्रिप्टर (या अन्य शांत चीजें) निर्दिष्ट करना संभव नहीं है
यदि आप वास्तव में चलाए जाने के बारे में धारणा बनाते हैं, तो सुरक्षा कमजोरियों को पेश करने की क्षमता है:
// If there is an executable called "notepad.exe" somewhere on the path
// then this might not do what we expect
p.StartInfo.FileName = "notepad.exe";
p.Start();
CreateProcessएक प्रक्रिया शुरू करने का एक और अधिक सटीक तरीका है - यह रास्ता नहीं खोजता है और आपको बच्चे की प्रक्रिया के मानक इनपुट या आउटपुट (अन्य चीजों के बीच) को पुनर्निर्देशित करने की अनुमति देता है। CreateProcessहालाँकि इसका नुकसान यह है कि ऊपर दिए गए 3 उदाहरणों में से कोई भी काम नहीं करेगा (इसे देखें और देखें)।
सारांश में, यदि आपको UseShellExecuteगलत पर सेट करना चाहिए :
- आप मानक इनपुट / आउटपुट / त्रुटि को पुनर्निर्देशित करना चाहते हैं (यह सबसे आम कारण है)
- आप निष्पादन योग्य (जैसे सुरक्षा कारणों से) के लिए रास्ता नहीं खोजना चाहते हैं
इसके विपरीत UseShellExecuteयदि आप दस्तावेज़, यूआरएल या बैच फाइल आदि खोलना चाहते हैं तो आपको सही रखना चाहिए ... बल्कि स्पष्ट रूप से किसी निष्पादन योग्य को रास्ता देना चाहिए।
processStartInfo.RedirectStandardOutput=true, ऐसा लगता है कि आप अभी भी मानक आउटपुट को रीडायरेक्ट कर सकते हैंprocess.Arguments= "cmd /c dir >c:\\crp\\a.a"। एक रन संवाद बॉक्स से इसी तरह आप कर सकते हैंcmd /c dir>c:\crp\a.a