2009-11-26 3 views
8

में "सिस्टम" को कॉल करते समय सुप्र्रेस कंसोल मैं कुछ बाहरी प्रोग्राम को कॉल करने के लिए C++ में system कमांड का उपयोग कर रहा हूं, और जब भी मैं इसका उपयोग करता हूं, तो कंसोल विंडो खुलती है और कमांड समाप्त होने के बाद बंद हो जाती है।सी ++

मैं कंसोल विंडो खोलने से कैसे बच सकता हूं? अगर समाधान मंच-स्वतंत्र हो सकता है तो मुझे खुशी होगी। मैं अपने प्रोग्राम को आदेश समाप्त होने तक प्रतीक्षा करना चाहूंगा।

+0

बेहतर उत्तरों (विंडोज़ के लिए) के साथ डुप्लिकेट: http://stackoverflow.com/questions/1597289/hide-console-in-c-system-function-win – Steed

उत्तर

3

ऐसा लगता है जैसे आप विंडोज का उपयोग कर रहे हैं।

लिनक्स (और * सामान्य रूप से निक्स) पर, मैं क्रमशः fork और exec पर कॉल के साथ system पर कॉल को प्रतिस्थापित कर दूंगा। विंडोज़ पर, मुझे लगता है कि विंडोज एपीआई — में कुछ प्रकार का स्पॉन-ए-न्यू-प्रोसेस फ़ंक्शन प्रलेखन से परामर्श लेता है।

जब आप खोल कमांड और/या बाहरी प्रोग्राम चला रहे हैं, तो आपका प्रोग्राम प्लेटफ़ॉर्म-स्वतंत्र बनाना कठिन है, क्योंकि यह आपके द्वारा चलाए जा रहे आदेशों और/या बाहरी प्रोग्राम वाले प्लेटफॉर्म पर निर्भर करेगा।

+0

आम तौर पर, आप मंच-निर्भर होने वाले कार्यक्रमों के बारे में सही हैं खोल कमांड का उपयोग करते समय। हालांकि, इस मामले में, मैं यह सुनिश्चित कर रहा हूं कि बाहरी प्रोग्राम उस मशीन पर स्थापित है जिसका मैं उपयोग कर रहा हूं। यह एक साधारण खोल कमांड नहीं है। आपके उत्तर के बारे में - यूनिक्स के लिए विंडोज़ और फोर्क + निष्पादन के लिए CreateProcess का उपयोग करना संभव है, लेकिन मैं इसे और अधिक सुन्दर तरीके से हल करने की उम्मीद कर रहा था। – Dana

+0

CreateProcess/fork + exec के बारे में क्या सुरुचिपूर्ण नहीं है? यदि आप इसे एक अच्छी कक्षा में लपेटते हैं, तो आपके पास प्रक्रिया शुरू करने का एक बहुत ही शानदार तरीका है, साथ ही आप आउटपुट/इनपुट ect को पुनर्निर्देशित करने जैसे विकल्पों को आसानी से जोड़ सकते हैं। – stijn

1

एरम देखें। CreateProcess या ShellExecute

5

यह शायद सबसे आसान और शायद सबसे अच्छा तरीका है, यह भी ऐसा करेगा जिससे आपका आदेश इस आदेश को चलाने के दौरान फ्रीज न हो। पहले विंडोज हेडर का उपयोग करके शामिल करना न भूलें;

#include <Windows.h> 

फिर आपको अपना आदेश चलाने के लिए निम्न फ़ंक्शन का उपयोग करने की आवश्यकता है;

WinExec("your command", SW_HIDE); 

नोट; एक दशक से अधिक के लिए WinExec विधि को हटा दिया गया है। हालांकि आज भी यह ठीक काम करता है। यदि आवश्यक नहीं है तो आपको इस विधि का उपयोग नहीं करना चाहिए।

... जिस तरह से आप का उपयोग करना चाहते हैं;

system("your command"); 
+2

मैं शायद WinExec को "सर्वश्रेष्ठ" तरीका कहूंगा, क्योंकि इसे 17 से अधिक वर्षों से हटा दिया गया है। –

+0

ठीक है, मुझे इसके बारे में निश्चित नहीं था इसलिए मैंने कहा कि शायद –

+1

मेरे लिए ठीक काम किया, भले ही मुझे बहिष्कृत किया गया हो, मुझे घंटों की तलाश करने के बाद मुझे ऊपर हटना होगा। धन्यवाद – Demurgos

0

यहाँ एक नया cmd.exe खिड़की के बिना आदेश पर अमल करने के लिए एक तरीका है।

सभी Windows प्लेटफार्मों पर
int windows_system(const char *cmd) 
{ 
    PROCESS_INFORMATION p_info; 
    STARTUPINFO s_info; 
    LPSTR cmdline, programpath; 

    memset(&s_info, 0, sizeof(s_info)); 
    memset(&p_info, 0, sizeof(p_info)); 
    s_info.cb = sizeof(s_info); 

    cmdline  = _tcsdup(TEXT(cmd)); 
    programpath = _tcsdup(TEXT(cmd)); 

    if (CreateProcess(programpath, cmdline, NULL, NULL, 0, 0, NULL, NULL, &s_info, &p_info)) 
    { 
    WaitForSingleObject(p_info.hProcess, INFINITE); 
    CloseHandle(p_info.hProcess); 
    CloseHandle(p_info.hThread); 
    } 
} 

काम करता है: पर Roland Rabien's answer और MSDN आधार पर, मैं एक काम समारोह में लिखा है। जैसे ही आप system() पर कॉल करेंगे।