tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von deepthroat
ERLEDIGT
JA
ANTWORTEN
3
ZUGRIFFE
337
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    RELAX RELAX ist offline Mitglied
    Registriert seit
    Jan 2011
    Beiträge
    12
    Hallo,
    da ich mich mit cmd besser auskenne als mit C++ frage ich komplexere
    Informationen immer über einen cmd-befehl ab und bearbeite diese
    Informationen dann intern.
    Das funktioniert mit
    Code :
    1
    
    popen()
    auch sehr gut.
    Kleines Beispiel:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    char    txt[MAX_PATH];
    char    psBuffer[MAX_PATH];
    char    out[MAX_PATH];
    FILE    *pPipe;
    //...
    strcat(txt, "echo %appdata%");
            
            if( (pPipe = _popen( txt, "rt" )) != NULL )
            {
                ShowWindow(FindWindow(NULL, "VilleichtTitelDesCmdFensters?"), SW_HIDE);
                while( !feof( pPipe ) )
                {
                    if( fgets( psBuffer, MAX_PATH, pPipe ) != NULL )
                        strcat(out, psBuffer);
                }
            }
            MessageBox(NULL, out, "Dein AppData-Pfad", MB_OK);

    In diesem simplen Fall wäre natürlich viel einfacher:
    Code :
    1
    2
    3
    
    char app[MAX_PATH];
    //...
    GetEnvironmentVariable("APPDATA",app, sizeof(app));
    ...aber ist ja nur ein Beispiel...


    Naja zurück zu meinem Problem:
    Das alles FUNKTIONIET, allerdings gibt es bei meinen Usern immer
    komische Rückmeldungen wenn neben der GUI immer kurz ein
    Dos-Fenster aufblitzt.

    Ich habe verschiedene Lösungsansätze gefunden:
    Über
    Code :
    1
    
    CreateProcess()
    und Fenster verstecken.
    Problem:
    Ich weiß das man so ein programm das gestartet wird
    verstecken kann, aber kann man auch auslesen was das Programm zurückgibt?

    Man könnte natürlich auch alles in eine Datei speichern
    und die dann auslesen.
    CMD:
    echo %appdata% > datei.txt
    allerdings wäre das unprofessionell.

    Allgemein gefragt (auch für andere user mit ähnlichem Problem):
    Gibt es eine Lösung ein Externes Programm
    versteckt zu starten und ein Stream zum
    lesen bzw. schreiben aufzubauen um
    ausgaben bzw. eingaben zu tätigen?

    Danke im voraus an jeden der sich das ganze überhaupt durchgelesen hat
    Gruß RELAX
    Geändert von RELAX (17.10.11 um 14:49 Uhr)
     

  2. #2
    Thomasio Thomasio ist offline Mitglied Platin
    Registriert seit
    Aug 2006
    Beiträge
    680
    Ich schreibe in solchen Fällen statt einer Console Anwendung einfach eine GUI Anwendung, lasse aber CreateWindow() ShowWindow() usw. weg.
    Solange du die richtigen header includest und keine sichtbare Ausgabe brauchst, ergibt das das Selbe, mal abgesehen davon, dass du (unter Windows) für den Einsprung halt WinMain() brauchst.
     

  3. #3
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    @Thomasio: Ich glaube du hast das Problem nicht verstanden. Er / sie hat ein GUI Programm, allerdings werden Unterprogramme gestartet die eine Konsole öffnen.
    Zitat Zitat von RELAX
    Code c:
    1
    2
    3
    4
    5
    
    while( !feof( pPipe ) )
                {
                    if( fgets( psBuffer, MAX_PATH, pPipe ) != NULL )
                        strcat(out, psBuffer);
                }
    Diese Art Schleife sollte man vermeiden. Sie ist fehleranfällig und unnötig kompiliziert:
    Code c:
    1
    2
    3
    
    while( fgets( psBuffer, MAX_PATH, pPipe ) != NULL ) {
            strcat(out, psBuffer);
    }
    Antwort auf die ursprüngliche Frage: Ja, es gibt eine Möglichkeit ein Programm zu starten ohne eine Konsole zu öffnen. Siehe z.B. http://support.microsoft.com/kb/190351

    Gruß
    RELAX bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  4. #4
    RELAX RELAX ist offline Mitglied
    Registriert seit
    Jan 2011
    Beiträge
    12
    Danke. Funktioniert Perfekt!
     

Ähnliche Themen

  1. Antworten: 4
    Letzter Beitrag: 25.08.10, 19:13
  2. Antworten: 6
    Letzter Beitrag: 20.06.09, 12:12
  3. "Vermeiden" einer Endlosschleife
    Von frisbee im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 02.09.07, 19:06
  4. Antworten: 3
    Letzter Beitrag: 22.04.04, 17:53
  5. pop up fenster mit "back" und "forward" button/leiste
    Von Atti im Forum Javascript & Ajax
    Antworten: 12
    Letzter Beitrag: 26.02.02, 08:19

Stichworte