2008-12-03 27 views
6

से शुरू होने पर कमांड लाइन पर आउटपुट मैं एक ऐसा एप्लीकेशन लिख रहा हूं जिसे मानक WinForms ऐप या कमांड लाइन से अनुपयुक्त मोड में शुरू किया जा सकता है। एप्लिकेशन वीएस 2 के 5 मानक WinForms टेम्पलेट का उपयोग कर बनाया गया था।कमांड लाइन

जब आदेश कमांड लाइन से निष्पादित किया जाता है, तो मैं इसे आउटपुट जानकारी देना चाहता हूं जिसे एप्लिकेशन को निष्पादित करने वाली स्क्रिप्ट द्वारा कैप्चर किया जा सकता है। जब मैं इसे सीधे कंसोल से करता हूं। राइटलाइन(), आउटपुट प्रकट नहीं होता है, हालांकि इसे फ़ाइल में पाइप करके कैप्चर किया जा सकता है।

दूसरी ओर, मैं कर्नेल 32 से AllocConsole() पर पी/Invoke करके दूसरे कंसोल को पॉप अप करने के लिए एप्लिकेशन को मजबूर कर सकता हूं। यह वही नहीं है जो मैं चाहता हूं। मैं चाहता हूं कि आउटपुट उसी विंडो में दिखाई दे जिसे एप्लिकेशन से कॉल किया गया था।

<STAThread()> Public Shared Sub Main() 

    If My.Application.CommandLineArgs.Count = 0 Then 
     Dim frm As New ISECMMParamUtilForm() 
     frm.ShowDialog() 
    Else 
     Try 
      ConsoleControl.AllocConsole() 
      Dim exMan As New UnattendedExecutionManager(ConvertArgs()) 
      IsInConsoleMode = True 
      OutputMessage("Application started.") 
      If Not exMan.SetSettings() Then 
       OutputMessage("Execution failed.") 
      End If 
     Catch ex As Exception 
      Console.WriteLine(ex.ToString()) 
     Finally 
      ConsoleControl.FreeConsole() 
     End Try 

    End If 

End Sub 

Public Shared Sub OutputMessage(ByVal msg As String, Optional ByVal isError As Boolean = False) 
    Trace.WriteLine(msg) 
    If IsInConsoleMode Then 
     Console.WriteLine(msg) 
    End If 

    If isError Then 
     EventLog.WriteEntry("ISE CMM Param Util", msg, EventLogEntryType.Error) 
    Else 
     EventLog.WriteEntry("ISE CMM Param Util", msg, EventLogEntryType.Information) 
    End If 

End Sub 

उत्तर

2

अद्यतन: 1:

ने माइकल को बर जवाब में कहा, Raymond Chen हाल ही में posted a short article about this

यह मुख्य कोड है कि मुझे कमांड लाइन से एक कंसोल पॉप अप करने के लिए अनुमति देता है। मुझे यह देखकर खुशी हो रही है कि मेरा अनुमान पूरी तरह से गलत नहीं था।

अद्यतन 0:

अस्वीकरण: यह "जवाब" ज्यादातर अटकलें है। मैं इसे केवल इसलिए पोस्ट करता हूं क्योंकि यह सुनिश्चित करने के लिए पर्याप्त समय बीत चुका है कि बहुत से लोगों के पास मूलभूत प्रश्न की तरह दिखने का उत्तर नहीं है।

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

समस्या मौलिक है, मुझे लगता है, क्योंकि एक कंसोल एप्लिकेशन को कॉलिंग कंसोल एप्लिकेशन का "नियंत्रण" लेना पड़ता है। और बच्चे के आवेदन के कोड चलने से पहले ऐसा करना है।

9

रेमंड चेन हाल ही में पोस्ट (एक महीने के बाद सवाल इतने पर यहां तैनात किया गया था) इस बारे में एक संक्षिप्त लेख:

How do I write a program that can be run either as a console or a GUI application?

आप नहीं कर सकते हैं, लेकिन आप इसे नकली करने की कोशिश कर सकते हैं।

प्रत्येक पीई आवेदन अपने शीर्षक में एक क्षेत्र यह बताता है कि जो सबसिस्टम यह अंतर्गत चलाने के लिए डिजाइन किया गया था शामिल हैं। आप कह सकते हैं IMAGE_SUBSYSTEM_WINDOWS_GUI एक Windows जीयूआई आवेदन के रूप में अपने आप को , चिह्नित करने के लिए या आप IMAGE_SUBSYSTEM_WINDOWS_CUI है कि आप एक सांत्वना आवेदन कर रहे हैं कहने के लिए कह सकते हैं। यदि आप जीयूआई एप्लीकेशन हैं, तो प्रोग्राम कंसोल के बिना चलाएगा।

सबसिस्टम निर्धारित करता है कि कर्नेल प्रोग्राम के लिए निष्पादन वातावरण को कैसे तैयार करता है। कार्यक्रम सांत्वना सबसिस्टम में चल रहे के रूप में चिह्नित है, तो गिरी कार्यक्रम के कंसोल करने के लिए अपने माता-पिता की सांत्वना कनेक्ट करेगा, एक नए कंसोल बनाने यदि माता-पिता एक सांत्वना भी नहीं है। , दूसरी ओर (यह एक अधूरी वर्णन है, लेकिन विवरण चर्चा करने के लिए प्रासंगिक नहीं हैं।) यदि कार्यक्रम, कर्नेल एक जीयूआई आवेदन के रूप में चल रहा है तो कार्यक्रम चलेंगे बिना के रूप में चिह्नित है कोई कंसोल बिल्कुल।

है कि लेख एक और करने के लिए वह बताते हैं Junfeng झांग से चर्चा करता है कि कैसे कार्यक्रमों के एक जोड़े (विजुअल स्टूडियो और ILDASM) इस व्यवहार को लागू में:

How to make an application as both GUI and Console application?

VisualStudio मामले में, देखते हैं वास्तव में दो बाइनरी: devenv.com और devenv.exe। Devenv.com एक कंसोल ऐप है। Devenv.exe एक जीयूआई ऐप है। जब आप Win32 जांच नियम के कारण devenv टाइप करते हैं, devenv.com निष्पादित किया जाता है। यदि कोई इनपुट नहीं है, तो devenv.com devenv.exe लॉन्च करता है, और खुद से बाहर निकलता है। यदि इनपुट हैं, तो devenv.com उन्हें सामान्य कंसोल ऐप के रूप में संभालता है।

ildasm मामले में, केवल एक बाइनरी है: ildasm.exe। यह पहली बार एक जीयूआई आवेदन के रूप में संकलित है। बाद में editbin.exe को इसे कंसोल उपप्रणाली के रूप में चिह्नित करने के लिए प्रयोग किया जाता है। इसकी मुख्य विधि में यह निर्धारित करता है कि इसे कंसोल मोड या जीयूआई मोड के रूप में चलाने की आवश्यकता है या नहीं। यदि जीयूआई मोड के रूप में चलाने की आवश्यकता है, तो यह स्वयं को एक जीयूआई ऐप के रूप में पुनः लॉन्च करता है।

devenv.com एक सामान्य प्रयोजन कंसोल मोड ठूंठ अनुप्रयोग है:

रेमंड चेन के लेख के लिए टिप्पणी में, laonianren कि यह कैसे काम करता है दृश्य स्टूडियो के Junfeng झांग संक्षिप्त विवरण में जोड़ने के लिए है। जब यह चलता है तो यह कंसोल के stdin, stdout और stderr को पुनर्निर्देशित करने के लिए तीन पाइप बनाता है। इसके बाद इसका अपना नाम (आमतौर पर devenv.com) मिलता है, ".com" को ".exe" के साथ बदल देता है और stdin पाइप के पढ़ने के अंत और stdout के लिखने के सिरों का उपयोग करके नया ऐप (यानी devenv.exe) लॉन्च करता है और मानक हैंडल के रूप में stderr पाइप। फिर यह बस बैठता है और बाहर निकलने के लिए devenv.exe की प्रतीक्षा करता है और कंसोल और पाइप के बीच डेटा कॉपी करता है।

इस प्रकार, हालांकि devenv.exe एक gui ऐप है, लेकिन यह अपने मानक हैंडल का उपयोग करके "पैरेंट" कंसोल को पढ़ और लिख सकता है।

और आप myapp.com पर इसका नाम बदलकर myapp.exe के लिए devenv.com का उपयोग कर सकते हैं। लेकिन आप अभ्यास में नहीं हो सकते क्योंकि यह एमएस से संबंधित है।