2010-04-20 14 views
6

से आउटपुट एकत्र करने के लिए हैंडल का उपयोग करके मैं अपने जीयूआई एप्लिकेशन से विंडोज में बाहरी कंसोल एप्लिकेशन चलाने के लिए CreateProcess() का उपयोग कर रहा हूं। मैं किसी भी तरह आउटपुट इकट्ठा करना चाहता हूं यह जानने के लिए कि त्रुटियां हैं या नहीं। अब मुझे पता है कि मुझे hStdOutput के साथ कुछ करना है, लेकिन मैं समझने में असफल रहा। मैं C++ और एक अनुभवहीन प्रोग्रामर के लिए नया हूं और मुझे वास्तव में नहीं पता कि एक हैंडल के साथ क्या करना है या पाइप को कैसे प्रकाश देना है।CreateProcess()

मैं आउटपुट को किसी प्रकार के चर (या फ़ाइल) में कैसे प्राप्त करूं?

void email::run(string path,string cmd){ 


    WCHAR * ppath=new(nothrow) WCHAR[path.length()*2]; 
    memset(ppath,' ',path.length()*2); 
    WCHAR * pcmd= new(nothrow) WCHAR[cmd.length()*2]; 
    memset(pcmd,' ',cmd.length()*2); 

    string tempstr; 


    ToWCHAR(path,ppath); //creates WCHAR from my std::string 
    ToWCHAR(cmd,pcmd); 

    STARTUPINFO info={sizeof(info)}; 
    info.dwFlags = STARTF_USESHOWWINDOW; //hide process 

    PROCESS_INFORMATION processInfo; 

    if (CreateProcess(ppath,pcmd, NULL, NULL, FALSE, 0, NULL, NULL, &info, &processInfo)) 
     { 
     ::WaitForSingleObject(processInfo.hProcess, INFINITE); 

     CloseHandle(processInfo.hProcess); 
     CloseHandle(processInfo.hThread); 
     } 

    delete[](ppath); 
    delete[](pcmd); 
} 

इस कोड को शायद किसी भी सभ्य प्रोग्रामर चीख करता है, लेकिन (मैं यह भी कहना नहीं करना चाहिए यह :) यह काम करता है ;-)

:

यह मैं क्या एक पल है प्रश्न: मैं फ़ाइल को आउटपुट पढ़ने के लिए hstdOutput का उपयोग कैसे करूं (उदाहरण के लिए)?

+0

संबंधित: [? Stdin stdout के साथ एक exe/प्रक्रिया का शुभारंभ और stderr] (http://stackoverflow.com/questions/5485923/launch-an-exe-process-with-stdin -stdout और stderr/39,648,986)। साथ ही, [छोटी-प्रक्रिया-लाइब्रेरी] देखें (https://github.com/eidheim/tiny-process-library) जो बहुत सुविधाजनक है। – Delgan

उत्तर

-2

BOOL WINAPI GetExitCodeProcess ( __in hProcess, संभाल LPDWORD lpExitCode __out);

प्रक्रिया की निकास कोड प्राप्त करने के लिए पास प्रक्रियाInfo.hProcess।

+0

वह आउटपुट प्राप्त करना चाहता है, बाहर निकलने वाला कोड नहीं। – fleed

3

माइक्रोसॉफ्ट के पास अपने ज्ञान आधार में एक उदाहरण है जो दर्शाता है कि कैसे बाल कंसोल प्रक्रिया के आउटपुट को कैप्चर करना है। मूलभूत सिद्धांत यह है कि मूल प्रक्रिया पाइप (एक मानक हैंडल प्रति रीडायरेक्ट करने के लिए) बनाती है और हैंडल को CreateProcess में पास करती है।

बच्चे की प्रक्रिया को काम करने के लिए संशोधित करने की आवश्यकता नहीं है, जो महत्वपूर्ण है यदि आपके बच्चे के स्रोत पर नियंत्रण नहीं है।

अधिक जानकारी: How to spawn console processes with redirected standard handles

संबंधित मुद्दे