Externes Programm starten und terminieren

JJB

Cogito ergo brumm
Tach Tach !

Mal ne ganz dumme Situation.
Ich arbeite nun schon ewig mit VS .Net C# und jetzt brauche ich mal kurz eine kleine Konsolenanwendung in c++ die einen ganz einfachen Aufruf tätigt. Ich hab aber absolut keine Ahnung mehr wie ich das in C++ richtig hinbiege.

Ich möchte eine Exe in c++ schreiben, die auf Knopfdruck ein Programm mit diversen Übergabeparametern startet (bzw. wenn sie selbst Parameter erhält, diese dann umwandelt und weiterleitet) jedoch nach dem Start des anderen Programms terminiert ohne dass das andere Programm beeinträchtigt wird.
Dies sollte keine/wenige Bibliotheken benötigen.

Das sollte doch ohne weiteres Möglich sein, oder ?
Kann mir jemand ein kurzes Codebeispiel zukommen lassen ? Ich steh voll auf dem Schlauch.

Danke

MFG JJB
_
 
Hallo

Vielleicht hilft dir die Funktion _spawn() ja weiter.
Beispiel:

Code:
_spawnl(P_NOWAIT,"Programmname.exe", "Programmname.exe", 0L);

Genaueres über die unterschiedlichen _spawn() Funktionen und deren Parameter sind in der MSDN-Library zu finden. Ich denke das wird zu viel um alles hier zu beschreiben.
Aber da kannst du dir dann die Funktion raus suchen, welche für deine Ziele paßt.

Ich hoffe ich konnte helfen.

Gruß Byteblaster
 
Unter Windows kannst du auch ShellExecute verwenden (oder wenns einfach und billig sein soll, WinExec, das aber intern auch ShellExecute aufruft).

Die starten das Programm und laufen dann weiter. Dann brauchst du nur aus deinem Programm rauslaufen und schon ist es beendet.
 
Die Spawn Funktionen sind mir ein wenig zu unübersichtlich, und da ich sie nur in Englisch dokumentiert vorliegen habe, habe ich mich nicht allzu tief hineingewagt.

Ich habe die Shellexecute Variante eingebaut. Allerdings bekomme ich Probleme mit dem Handle. Da erscheint ein Syntaxfehler in der Winapi.h. Vielleicht fehlt ein weiteres #include.
Daher versuche ich es ohne Handle, bekomme allerdings einen Fehler beim Ausführen
ShellExecute(NULL,NULL,"Setup1.exe", NULL, NULL, SW_NORMAL);

Jemand einen Tip, wie ich den Sytnax Fehler durch vielleicht ein zusätzliches include vermeide, oder ohne ein Handle arbeiten kann ?

Danke !
 
Schwer zu sagen, welches Handle du meinst. Zeig doch mal den Error den du bekommst.

Alternativ brauchst du für ShellExecute shellapi.h. Falls das nicht reicht, noch windows.h, aber mehr sollte eigentlich nicht nötig sein.
 
Ich kann den Fehler nicht rekonstruieren. Jetzt habe ich nur noch ein Fehler, dass es den Typ HANDLE nicht gibt.

Das Problem liegt möglicher an einem Zeitfehler.
Das Konsolenprogramm soll lediglich auf Aktivieren hin, einen Aufruf mit diversen Parametern starten. Danach wird es geschlossen. Wenn ich nun das Programm ohne den HANDLE Parameter ausführe und nach absenden des Aufrufs nicht schließe, funktioniert das einwandfrei.
Möglicherweise liegt es einfach daran, dass der Aufruf nicht ausgeführt werden kann, bevor das Programm viel zu schnell beendet wird.
Ich habe versucht einen Sleep von 2 Sekunden einzubauen oder eine Printf Schleife, aber bislang besteht das Problem weiterhin.
 
Eigentlich wartet ShellExecute bis das Programm gestartet ist.
Welches HANDLE meinst du denn da eigentlich? ShellExecute hat ein HWND als ersten Parameter, das du ruhig auf NULL setzen kannst, aber HANDLEs sehe ich da gar nicht.

HANDLE ist nur ein typedef auf void*, bei mir ist das in winnt.h definiert, die müsste allerdings über windows.h mit includet werden.

Wenn du keine Pause nach dem Aufruf setzt, das aufzurufende Programm also nicht startet, lass dir mal den Rückgabewert ausgeben.

Wenn's denn dann gar nicht will, kannst du immer noch auf WinExec ausweichen. Da musst du nur den kompletten Filenamen in Anführungszeichen setzen, falls Spaces drin vorkommen.
 
Also mit WinExec scheint das jetzt zu funktionieren. Was ist da der große Unterschied zu ShellExecute ?
Wieder so eine MS Sache ?

Danke für die Tips !

MFG JJB
 
WinExec ruft intern CreateProcess auf. Das kann auch Programme startet, ist allerdings um 5 Ecken umständlicher. Dafür kann man das gestartete Programm leichter überwachen.

ShellExecute mit "open" sollte eigentlich auch nichts anderes tun. Dadurch, dass es eigentlich der Shell das Starten aufdrückt kommt es wohl zu Ungereimtheiten (ich benutze immer CreateProcess zum Starten von Programmen).
 

Neue Beiträge

Zurück