2009-11-26 16 views
8

bazı harici programı çağırmak için C++ system komutu kullanıyorum ve bunu her kullandığınızda, bir konsol penceresi açılır ve komut tamamlandıktan sonra kapanır çağıran.Supress konsol c "sistemi" ++

Nasıl bir konsol penceresi açılmasını önleyebilirsiniz? Çözüm platformdan bağımsız olursa mutlu olurum. Programımın komut bitene kadar beklemesini isterim.

+0

Daha iyi yanıtlarla çoğaltma (Windows için): http://stackoverflow.com/questions/1597289/hide-console-in-c-system-function-win – Steed

cevap

3

Windows kullanıyorsunuz gibi görünüyor.

Linux'ta (ve genel olarak * nix), aramayı sırasıyla fork ve exec numaralı çağrılarla system yerine gönderirim. Pencerelerde, Windows API —'da bir çeşit yeni-işlem işlevi olduğunu düşünüyorum. o komutları ve/veya yayınladığınız harici programları olan platforma bağlı olacaktır olarak

Eğer kabuk komutlarını ve/veya harici programları yayınlıyor, programınız, platformdan bağımsız hale getirmek için zordur. POSIX olduğu gibi

+0

Genel olarak, platform bağımlı programlar hakkında haklısınız. kabuk komutlarını kullanırken. Ancak, bu durumda, harici programın kullandığım makineye yüklendiğinden emin oluyorum. Basit bir kabuk komutu değil. Cevabınızla ilgili olarak - Unix için Windows ve fork + exec için CreateProcess kullanmak mümkündür, ancak bunu daha zarif bir şekilde çözmeyi umuyordum. – Dana

+0

CreateProcess/fork + exec hakkında ne zarif değil? Güzel bir sınıfa sarılırsa, süreçleri başlatmanın çok zarif bir yoluna sahip olursunuz, ayrıca çıktı/giriş ekt'i yeniden yönlendirmek gibi seçenekleri kolayca ekleyebilirsiniz. – stijn

1

errm bakın. CreateProcess veya ShellExecute. Bu komutu çalıştırırken programı dondurmak kalmaması

Bu muhtemelen en kolay ve belki de en iyi yoldur
5

, bu da onu yapacaktır. İlk başta Windows başlığını kullanarak kullanmayı unutmayın;

#include <Windows.h> 

Ardından, komutunuzu çalıştırmak için aşağıdaki işlevi kullanmanız gerekir;

WinExec("your command", SW_HIDE); 

Not; WinExec yöntemi on yıldan fazla bir süredir kullanımdan kaldırılmıştır. Yine de bugün hala iyi çalışıyor. Gerekmiyorsa bu yöntemi kullanmamalısınız.

... yerine kullanmak istemiyorsanız;

system("your command"); 
+2

17 yılı aşkın süredir kullanımdan kaldırıldığı için, WinExec'i "en iyi" şekilde çağırmam çok zor. –

+0

Tamam, bundan emin değildim, bu yüzden neden söyledim –

+1

Bana iyi çalışıyordu, kullanımdan kaldırılsa bile saatlerce aradığımdan beri destek olmak zorundayım. teşekkür ederim – Demurgos

0

İşte yeni cmd.exe pencerede komutları çalıştırmak için bir yol. Tüm Windows platformlarında

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); 
    } 
} 

İşleri: Roland Rabien's answer ve MSDN dayanarak, bir çalışma fonksiyonu yazdım. Sadece system() gibi arayın.