1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

C int system(const *char) in den Background bei XP

    • Frage
  • Zentor
  • 22. März 2004 um 19:37
  • Unerledigt
  • Zentor
    16
    Zentor
    Mitglied
    Reaktionen
    5
    Punkte
    2.710
    Beiträge
    506
    • 22. März 2004 um 19:37
    • #1

    Hallo, wie kann ich unter WinXP mit C erreichen, dass

    system("c:\test.exe"); /*(is von stdio.h)*/

    test.exe im Hintergrund öffnet, dann selber terminiert ->Eingabeaufforderung schließt sich, test.exe bleibt (wenns ein Windowsprogramm is). Ich bezweifle dass es geht, aber fragen kostet nix. Ich nehm auch gerne eine andere Methode als system...

    mfg Zentor

  • marX
    7
    marX
    Mitglied
    Reaktionen
    10
    Punkte
    460
    Beiträge
    88
    • 23. März 2004 um 20:27
    • #2

    also ich habe mal ne funktion programmiert um ein windows programm (konsolenprogramm .... gcc und so um genau zu sein) zu starten! man kann auch (optional) die ausgabe in einen puffer schreiben lassen!
    -> ich verwende aber hier (und das würde ich dir auch empfehlen) funktionen der windows-api (die fkt. system spinnt glaub ich teilweise....)

    Code
    /******************************************************************************
     * Funktion:     Führt ein externes Programm aus.
     * Parameter:    *cmd_line      = Zeiger auf die auszuführende Zeile 
     *                                (incl. Parameter)
     *               *buffer        = Zeiger auf einen Puffer in den die Ausgabe 
     *                                geschrieben wird. 
     *                                (Wenn == NULL => keine Ausgabe speichern!)
     *               buffer_size    = Länge des Puffers (buffer).
     * Rückgabewert: ERROR_PRG_NOT_FOUND wenn 
     *                  1) das Programm nicht gefunden wurde
     *                  2) ein Systemfehler aufgetretenn ist (z.B.: Fehler beim
     *                     Erzeugen der Pipes)! Dies ist aber SEHR unwarscheinlich!
     *               Sonst wird der Returnwert des Programmes zurückgeliefert.
     */
    int execute_programm(char *cmd_line, char *buffer, int buffer_size)
    {
       unsigned long return_value;
    
    
       // Security Attributes
       SECURITY_ATTRIBUTES secAttr;
       secAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
       secAttr.bInheritHandle = TRUE;
       secAttr.lpSecurityDescriptor = NULL;
    
    
       HANDLE h_child_write, h_parent_read, // "Child Out Pipe"
              h_child_read, h_parent_write; // "Child In Pipe"
    
    
       if (!CreatePipe(&h_parent_read, &h_child_write, &secAttr, MAX_BUILD_TEXT_LENGTH))
       {
          if (buffer != NULL)         // Wenn Buffer vorhanden -> "Leeren"
             buffer[0] = '\0';
    
    
          return ERROR_PRG_NOT_FOUND; // System Fehler!
       }
    
    
       if (!CreatePipe(&h_child_read, &h_parent_write, &secAttr, MAX_BUILD_TEXT_LENGTH))
       {
          if (buffer != NULL)         // Wenn Buffer vorhanden -> "Leeren"
             buffer[0] = '\0';
    
    
          CloseHandle(h_parent_read);
          CloseHandle(h_child_write);
    
    
          return ERROR_PRG_NOT_FOUND; // System Fehler!
       }
    
    
       STARTUPINFO startInfo;
       GetStartupInfo(&startInfo);
       startInfo.dwFlags     = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
       startInfo.wShowWindow = SW_HIDE;
       startInfo.hStdInput   = h_child_read;     // stdin
       startInfo.hStdOutput  = h_child_write;    // stdout
       startInfo.hStdError   = h_child_write;    // stderr
    
    
       PROCESS_INFORMATION procInfo;
       ZeroMemory(&procInfo, sizeof(PROCESS_INFORMATION));
    
    
       if (!CreateProcess(NULL, cmd_line, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS,
          NULL, NULL, &startInfo, &procInfo))
       {
          if (buffer != NULL)     // Wenn Buffer vorhanden -> "Leeren"
             buffer[0] = '\0';
    
    
          CloseHandle(h_parent_read);
          CloseHandle(h_child_write);
          CloseHandle(h_child_read);
          CloseHandle(h_parent_write);
    
    
          return ERROR_PRG_NOT_FOUND;
       }
    
    
       // Auf Ende warten ("unendlich" lang)!
       WaitForSingleObject(procInfo.hProcess, INFINITE);
    
    
       if (!GetExitCodeProcess(procInfo.hProcess, &return_value))
          return_value = ERROR_PRG_NOT_FOUND;
    
    
       if (buffer != NULL)
       {
          unsigned long bytes_read = 0;
    
    
          ReadFile(h_parent_read, buffer, buffer_size, &bytes_read, NULL);
          buffer[bytes_read] = '\0';
       }
    
    
       // Alle Handles auf den Prozess freigeben!
       CloseHandle(procInfo.hProcess);
       CloseHandle(procInfo.hThread);
    
    
       // Alle anderen Handles freigeben!
       CloseHandle(h_parent_read);
       CloseHandle(h_child_write);
       CloseHandle(h_child_read);
       CloseHandle(h_parent_write);
    
    
       return return_value;
    }
    Alles anzeigen

    -> das aufrufende programm (also dein programm) wartet allerdings bis das aufgerufene programm (zb. "test.exe") beendet wird! -> solltest du das nicht wollen musst du halt die zeile:

    Code
    WaitForSingleObject(procInfo.hProcess, INFINITE);


    ändern!!

    mfg marX

  • DGA
    5
    DGA
    Mitglied
    Punkte
    210
    Beiträge
    42
    • 23. März 2004 um 20:51
    • #3
    Zitat von Zentor


    Hallo, wie kann ich unter WinXP mit C erreichen, dass
    syste...

    falls du VS 2003 benutzt dann werdest du in MSDN ein einfaches Beispiel finden
    ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.1033/dllproc/base/creating_processes.htm

    damit es wie du willst funktioniert solltest du die letzte 3 Anweisungen löschen:

    WaitForSingleObject( pi.hProcess, INFINITE );
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );

  • Zentor
    16
    Zentor
    Mitglied
    Reaktionen
    5
    Punkte
    2.710
    Beiträge
    506
    • 23. März 2004 um 22:56
    • #4

    Uff, ich hatte gehofft, es geht in C mit einer einfachen Änderung, sozusagen das "&" von Unix im system() anghängen (system("c:\\test.exe&") :) ), nur halt für XP... oder das es irgendwie mit dem Umweg über cmd.exe geht... oder so eine fork pendant bei Windows, hab bis jetzt nix gefunden. Aber so wie ich das gesehen habe läuft das ganz anders unter XP, so kann ich z.B. die besagte Command Prompt manuell schließen und das darin vorher gestartete Programm läuft weiter. Habe mich noch *überhauptnicht* mit WinAPI und niederen Funktionen vom WinKernel beschäftigt, war wie gesagt eher ein naiver ansatz...
    Also vielen Dank für die bisherigen Lösungen, die sind aber overkills. Aber wie schon im ersten Posting erwähnt schätze ich es gibt keine Lösung um system() calls ohne wait zu implementieren mit Standard-C Library Funktionen. Is aber nicht so hohe Priorität,wird wie so ziemlich alles leider im Unfertigen zustand verbleiben...

    mfg Zentor

  • DGA
    5
    DGA
    Mitglied
    Punkte
    210
    Beiträge
    42
    • 24. März 2004 um 09:40
    • #5

    noch eine Möglichkeit:

    Code
    #include <process.h>
    
    
    
    
    int main(int arcgv, char **args) {
    	_execv("c://test.exe",args);
    	return 0;
    }

    und es gibts mehrere Varianten für _exec. Eine gute Beschreibung findest du in MSDN :
    ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.1033/vclib/html/_crt__exec.2c_._wexec_functions.htm

  • Zentor
    16
    Zentor
    Mitglied
    Reaktionen
    5
    Punkte
    2.710
    Beiträge
    506
    • 24. März 2004 um 18:17
    • #6

    Ja! Genau so eine Funktion hab ich gesucht. Habs schon abgeändert, funktioniert sehr gut.. Danke!
    mfg Zentor

  • Maximilian Rupp 27. Dezember 2024 um 12:06

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung