हमें UseShellExecute को True पर कब सेट करना है?


134
//
// Summary:
//     Gets or sets a value indicating whether to use the operating system shell
//     to start the process.
//
// Returns:
//     true to use the shell when starting the process; otherwise, the process is
//     created directly from the executable file. The default is true.
[DefaultValue(true)]
[MonitoringDescription("ProcessUseShellExecute")]
[NotifyParentProperty(true)]
public bool UseShellExecute { get; set; }

यदि हम एक नई प्रक्रिया की शुरुआत करते हैं, तो हमें UseShellExecute को True पर सेट करने की आवश्यकता कब होती है?

जवाबों:


202

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यदि आप दस्तावेज़, यूआरएल या बैच फाइल आदि खोलना चाहते हैं तो आपको सही रखना चाहिए ... बल्कि स्पष्ट रूप से किसी निष्पादन योग्य को रास्ता देना चाहिए।


2
ग्रेट स्टफ, लेकिन आप लिखते हैं कि (शेलएक्सक्यूट के साथ), "यह [आप दावा करते हैं] मानक इनपुट / आउटपुट / त्रुटि हैंडल को पुनर्निर्देशित करना संभव नहीं है" <- निश्चित रूप से यह गलत या गलत है। यहां तक ​​कि useShellExecute के साथ सही पर सेट करें, जबकि वास्तव में आप ऐसा नहीं कर सकते हैं processStartInfo.RedirectStandardOutput=true, ऐसा लगता है कि आप अभी भी मानक आउटपुट को रीडायरेक्ट कर सकते हैं process.Arguments= "cmd /c dir >c:\\crp\\a.a"। एक रन संवाद बॉक्स से इसी तरह आप कर सकते हैंcmd /c dir>c:\crp\a.a
barlop

4
इसके अलावा, आप कहते हैं कि जब UseShellExecute=falseCreateTcess, पथ की जाँच नहीं करेगा, लेकिन मैं देखता हूं कि जब मैं "UseShellExecute = false" करता हूं, तो माना जाता है कि पथ की जांच नहीं कर रहा है, तो फिर प्रक्रिया .ileName = "cmd.exe" काम करता है इसलिए c: \ windows \ system32 की जाँच करना। और अगर मैं cmd.exe को c: \ windows में कॉपी करता हूं और इसे cmmmd.exe नाम देता हूं, तो मैं process1.FileName = "cmmmd.exe" करता हूं जो बहुत काम करता है इसलिए यह c: \ windows की जांच कर रहा है, तो ऐसा लगता है जैसे यह पथ की जाँच कर रहा है, या निर्देशिकाओं का कुछ गुच्छा।
बार्लोप

2
MSDN डॉक्स @barlop से सहमत है: "जब UseShellExecute झूठा है, तो FileName गुण निष्पादन योग्य के लिए पूरी तरह से योग्य पथ हो सकता है, या एक साधारण निष्पादन योग्य नाम जिसे सिस्टम PATH पर्यावरण चर द्वारा निर्दिष्ट फ़ोल्डरों के भीतर खोजने का प्रयास करेगा।"
बॉब

सेटिंग UseShellExecuteकरने से trueमैं एक पर्यावरण चर साझा करने में सक्षम था (जो केवल कॉलिंग प्रक्रिया में बनाया गया था)। बहुत काम
मितकिन

14

मुझे लगता है कि ज्यादातर गैर-निष्पादन योग्य हैं। उदाहरण के लिए .html, यदि आप किसी फ़ाइल को खोलने का प्रयास कर रहे हैं , यदि आपको सेट UseShellExecuteकरना trueहोगा और वह उस .htmlब्राउज़र में खुलेगा जो उपयोगकर्ता द्वारा डिफ़ॉल्ट रूप से सेट किया गया है।


12

से MSDN :

इस प्रॉपर्टी को झूठा सेट करना आपको इनपुट, आउटपुट और एरर स्ट्रीम को रीडायरेक्ट करने में सक्षम बनाता है।

यदि UserName गुण रिक्त या रिक्त स्ट्रिंग नहीं है, या एक InvalidOperationException ProcessStart (ProcessStartInfo) विधि कहा जाता है, तो UseShellExecute गलत होना चाहिए।

जब आप प्रक्रियाओं को शुरू करने के लिए ऑपरेटिंग सिस्टम शेल का उपयोग करते हैं, तो आप किसी भी दस्तावेज़ को शुरू कर सकते हैं (जो किसी भी पंजीकृत फ़ाइल प्रकार है जो एक निष्पादन योग्य के साथ जुड़ा हुआ है जिसमें एक डिफ़ॉल्ट खुली कार्रवाई है) और फ़ाइल पर संचालन करना, जैसे कि मुद्रण, प्रक्रिया घटक के साथ। जब UseShellExecute गलत है, तो आप केवल प्रक्रिया घटक के साथ निष्पादनयोग्य शुरू कर सकते हैं।

यदि आप ErrorDialog गुण को सही पर सेट करते हैं तो UseShellExecute सही होना चाहिए।


0

यदि हम वर्तमान एप्लिकेशन निष्पादन योग्य विंडो को छिपाना चाहते हैं, तो UseShellExecute को सही पर सेट किया जाना चाहिए


0

जब पथ में एक स्थान या कुछ अन्य विशेष (यानी उच्चारण) अक्षर होते हैं, तो CreateProcess (UseShellExecute = false) छोटी फ़ाइल नामों ("DOS" 8.3 संकेतन), ShellExecute (UseShellExecute = true) का उपयोग करके लंबी फ़ाइल नामों का उपयोग करता है। इसलिए जब आप UseShellExecute = false का उपयोग करते हैं, तो अपनी निर्देशिका और फ़ाइल नामों को 8.3 नामों (Google ".net पर 8.3 फ़ाइल नाम कैसे प्राप्त करें) में परिवर्तित करना सुनिश्चित करें। (यह निश्चित रूप से निश्चित नहीं है कि विंडोज संस्करण, और / या फ़ाइल सिस्टम इसे इस तरह से करते हैं, विंडोज 7, एनटीएफएस पर परीक्षण किया गया है।)


क्या ऐसा हो सकता है कि यह अंतरिक्ष में रास्ता काट रहा हो? "पथ / कार्यक्रम का नाम" के चारों ओर उद्धरण डालकर इसे हल करता है।
गबर्री
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.