2009-10-20 8 views
12

Ich bin ein C-Programm in Dev-C++ codieren, und ich muss ein paar Windows (CMD) -Befehle verwenden. Es ist einfach, aber wenn der Befehl in der system() - Funktion ausgeführt wird, führt das Programm die Konsole in der Ausführung aus.Konsole in C-System() -Funktion verbergen, Win

Ein Beispiel:

#include <stdio.h> 
#include <stdlib.h> 
#include <windows.h> 

    int main() 
    { 
     system("if not exist c:\my_docs\doc.txt (xcopy /Y doc.txt c:\my_docs\)"); // Cmd command 
     system("pause"); 
     return 0; 
    } 

Exists andere Funktion oder eine Modifikation das nicht die Konsole zeigt?

Vielen Dank! Freundliche Grüße.

+6

Dev C++ ist veraltet, ich empfehle dringend, einen anderen zu wählen – KeatsPeeks

+0

Wie erwarten Sie, dass der Befehl "Pause" funktioniert, wenn kein Konsolenfenster angezeigt wird? Auch cmd.exe ist eine Konsolenanwendung - es gibt keine einfache Möglichkeit für Sie zu verhindern, dass das Konsolenfenster angezeigt wird. –

+0

@Larry Osterman, Schön dich auf SO Larry zu sehen; Ich genieße den Blog! – BobbyShaftoe

Antwort

12

Sie können es mit CreateProcess tun.

STARTUPINFOW si; 
PROCESS_INFORMATION pi; 

ZeroMemory(&si, sizeof(si)); 
si.cb = sizeof(si); 
ZeroMemory(&pi, sizeof(pi)); 

if (CreateProcessW(command, arg, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) 
{ 
    WaitForSingleObject(pi.hProcess, INFINITE); 
    CloseHandle(pi.hProcess); 
    CloseHandle(pi.hThread); 
} 
+0

+1 Danke dir, ich werde es testen. Es ist nicht genau das, wonach ich gesucht habe, aber es ist eine gute Antwort. – a0rtega

+1

Ich habe Ihren Code in * Windows 7 * versucht, aber es funktioniert nicht. Ich möchte ** adb Shell-Broadcast-a NotifyServiceStart ** ausführen. Übrigens, ich habe die ** adb ** in den ** PATH ** eingefügt, und ** system() ** kann diese Zeile gut ausführen. – chenzhongpu

+0

http://msdn.microsoft.com/en-ca/library/windows/desktop/ms682425%28v=vs.85%29.aspx "Die Zeichenfolge kann den vollständigen Pfad und den Dateinamen des Moduls angeben, das ausgeführt werden soll oder es kann einen Teilnamen angeben.Im Fall eines Teilnamens verwendet die Funktion das aktuelle Laufwerk und das aktuelle Verzeichnis, um die Spezifikation zu vervollständigen.Die Funktion verwendet nicht den Suchpfad.Dieser Parameter muss die Dateinamenerweiterung enthalten; Erweiterung wird angenommen." –

3

Wie FigBug angegeben, Createprocess() ist der Weg zu gehen, aber ich glaube nicht, dass Createprocess() ein Shell-if-Anweisung ausführen kann. Möglicherweise müssen Sie es so als Befehl etwas passieren:

"cmd.exe /c \"if not exist c:\my_docs\doc.txt (xcopy /Y doc.txt c:\my_docs\)\"" 

aber eine bessere Lösung CreateFile() sein könnte zu testen, um zu verwenden, wenn eine Datei vorhanden ist und CopyFile() es zu kopieren.

+0

+1 Schließlich habe ich es getan, ist die beste Lösung in diesem Fall. – a0rtega

10

Sie können WinExec("your cmd command", SW_HIDE); statt system("cmd command") verwenden.

+1

Dies hat nicht auf Windows XP ... –

+0

Vielen Dank. Ich bin die Tage von 16-Bit-Windows bilden, aber diese Funktion vergessen. Es kam in einem wichtigen Szenario für Windows LogOn (Cred. Provider DLL), wo CreateProcess() von MS nicht erlaubt ist, und system() hat ein Konsolenfenster auf der Rückseite (und macht es daher keine attraktive Option) du! – BuddhaLight

0

HINWEIS: Meine Antwort ist nicht unbedingt auf Ihre spezielle Frage zugeschnitten, aber diese Q & A ist die oberste Google result für "Windows-System ohne Eingabeaufforderung" und andere ähnliche Abfragen.

Hier ist eine Möglichkeit, Befehle ohne ein neues cmd.exe Fenster auszuführen. Basierend auf Roland Rabien's answer und MSDN habe ich eine funktionierende Funktion geschrieben.

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

Funktioniert auf allen Windows-Plattformen. Rufen Sie einfach an, als würden Sie system() anrufen.