C++ popen() CMD Fenster "aufblitzen" vermeiden

RELAX

Grünschnabel
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:
popen()
auch sehr gut.
Kleines Beispiel:
Code:
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:
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:
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 :D
Gruß RELAX
 
Zuletzt bearbeitet:
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.
 
Hi.

@Thomasio: Ich glaube du hast das Problem nicht verstanden. Er / sie hat ein GUI Programm, allerdings werden Unterprogramme gestartet die eine Konsole öffnen.
RELAX hat gesagt.:
C:
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:
C:
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ß
 
Zurück