pablovic
Goto Top

C++ andere EXE aufrufen, Probleme mit Leerzeichen im Pfad

Hallo

Ich scheitere gerade daran ein kleines C++ Programm zu schreiben, welches eine andere EXE starten soll.
Das wollte ich eigentlich mit dem Aufruf system() lösen, soweit geht das auch aber wenn ich dem Aufruf system(mein Befehl mit Parametern) benutz schaff ichs nicht mehr.

Der Fehler lautet immer:
Der Befehl "C:\Program" ist entweder falsch geschrieben oder konnte nicht gefunden werden.   

Kann mir hier jemand helfen?

#include <iostream>
using namespace std;

int main(int argc, char *argv) {
	
	string befehl = "\"C:\\Program Files (x86)\\Anwendung XY\\Anwendung.exe";  
	string argumente;
	string space = " ";  
	
	//Argumente zusammenfügen
	for (int iLoop=1; iLoop < argc; iLoop++)
		argumente = argumente + space + argv[iLoop];
		
	//Befehl mit Argeumenten zusammenfügen
	befehl.append(argumente);
	befehl = befehl + "\""; //Abschliessendes " anfügen  
	
	cout << befehl;
	
	//Befehl in für system konvertieren
	system(befehl.c_str());
	
	return 0;
}

Wenn ich den Aufruf über system("\"C:\\Program Files (x86)\\Anwendung XY\\Anwendung.exe\"";) mache klappt es.
Ich hab schon versucht zusätzliche Anführungszeichen anzufügen oder "\\\" einen Backslash mehr aber ich kriegs nicht hin.

Danke und Gruss
P.

Content-Key: 330919

Url: https://administrator.de/contentid/330919

Printed on: April 25, 2024 at 01:04 o'clock

Member: emeriks
emeriks Mar 02, 2017 at 12:30:00 (UTC)
Goto Top
Hi,
Du musst schon nach dem ".exe" ein " einfügen, nicht erst am Ende.

E.
Mitglied: 132272
132272 Mar 02, 2017, updated at Mar 03, 2017 at 08:22:37 (UTC)
Goto Top
"\"C:\\Program Files (x86)\\Anwendung XY\\Anwendung.exe";
hier fehlt noch ein führendes \" das abschließende \"

Die Anführungszeichen müssen einmal um den Pfad der Anwendung und dann wenn die Argumente ebenfalls Leerzeichen haben jeweils auch umschlossen mit Anführungszeichen und um den ganzen Ausdruck.

Es soll ja das hier im Endeffekt bei rauskommen :
""C:\Program Files (x86)\Anwendung XY\Anwendung.exe" "ARG1" "ARG2" "ARGN""
nicht das hier
"C:\Program Files (x86)\Anwendung XY\Anwendung.exe ARG1 ARG2 ARGN"
da würde er alles inkl Argumente als den "Anwendungspfad" interpretieren.

Gruß
Member: pablovic
pablovic Mar 02, 2017 at 13:00:57 (UTC)
Goto Top
Danke für die Hinweise, hab ich bis jetzt nie so wahr genommen.
@132272: Das abschliessende " hab ich in Zeile 16 hinzugefügt - War dann aber ja sowieso eine Fehlüberlegung.

Ich hab das mal so gemacht erhalte aber immer noch den selben Fehler, nach dem ersten Space ist schluss.

#include <iostream>
using namespace std;

int main(int argc, char *argv) {
	
	string befehl = "\"C:\\Program Files (x86)\\Anwendung XY\\Anwendung.exe\"";   
	string argumente;
	string space = " ";  
	
	//Argumente zusammenfügen
	for (int iLoop=1; iLoop < argc; iLoop++)
		argumente = argumente + space + "\"" + argv[iLoop] + "\"";  
		
	//cout << argumente;
	
	//Befehl mit Argeumenten zusammenfügen
	befehl.append(argumente);
	//befehl = "\\" + befehl + "\\"; //Abschliessendes " anfügen 
	
	//cout << befehl;
	
	//Befehl in für system konvertieren
	system(befehl.c_str());
	
	return 0;
}
Member: emeriks
emeriks Mar 02, 2017 updated at 13:07:57 (UTC)
Goto Top
Zeile 6 -- Abschließendes Anführungszeichen!
string befehl = "\"C:\\Program Files (x86)\\Anwendung XY\\Anwendung.exe\"";    
Habe ich doch geschrieben: Nach dem ".exe"!
Member: pablovic
pablovic Mar 02, 2017 at 13:11:26 (UTC)
Goto Top
Ja sorry hatte ich im Quellcode schon so angepasst, aber beim ersetzen von oben kopiert.
Member: emeriks
emeriks Mar 02, 2017 at 13:16:29 (UTC)
Goto Top
Lass Dir doch in Zeile 23 den Befehl ausgeben, statt ihn auszuführen. Was kommt dann dabei raus?
Member: pablovic
pablovic Mar 02, 2017 at 13:29:43 (UTC)
Goto Top
"C:\Program Files (x86)\Anwendung XY\Anwendung.exe" "asdf" "asdf"
Member: emeriks
emeriks Mar 02, 2017 at 13:33:35 (UTC)
Goto Top
Und wenn Du das so in einer CMD eingibst, dann startet das Programm wir gewünscht?
Member: pablovic
pablovic Mar 02, 2017 at 13:42:20 (UTC)
Goto Top
Jep wie gewünscht, also ich hab jetzt die Ausgabe cout kopiert und ausgeführt.
Aber du meinst, ansich ist das schon richtig so?
Member: emeriks
emeriks Mar 02, 2017 at 14:27:38 (UTC)
Goto Top
Das sind jetzt 2 Sachen.
Das eine ist die Syntax der erzeugten Kommandozeile. Das ist ja unabhängig von der Programmiersprache.
C++ beherrsche ich nur rudimentär. Da hilft mir meistens mein Freund Google weiter.
Bzgl. Aufruf eines Kommandos habe ich jetzt spontan gefunden:
http://stackoverflow.com/questions/31201631/execute-cmd-commands-using- ...
http://stackoverflow.com/questions/14633155/how-to-execute-windows-syst ...
https://social.msdn.microsoft.com/Forums/vstudio/en-US/49f66662-0921-4c5 ...
Möglichweise geht das mit "system(...);" nicht und Du musst stattdessen "ShellExecute(...);" verwenden. Oder "CreateProcess(...);"
Member: pablovic
pablovic Mar 02, 2017 at 15:34:58 (UTC)
Goto Top
Danke
Member: rubberman
Solution rubberman Mar 02, 2017 at 22:12:45 (UTC)
Goto Top
Hallo.

Möglichweise geht das mit "system(...);" nicht
Doch, funktioniert wunderbar. Man muss nur wissen, was beim Aufruf der system() Funktion unter Windows passiert. Es wird ein cmd.exe Prozess erzeugt und Option /c zusammen mit der Kommandozeile übergeben.
Also quasi so:
%comspec% /c befehl
Der String 'befehl' muss eine Zeichenfolge sein, wie sie in diesem Kontext gültig ist. In diesem Fall muss um die gesamte Zeichenfolge noch ein zusätzliches Paar Anführungszeichen gesetzt werden. Resultierend so:
""C:\Program Files (x86)\Anwendung XY\Anwendung.exe" "asdf" "asdf""
... inclusive aller hier gezeigten Anführungszeichen.
Wie das zu escapen ist, sollte klar sein. Ansonsten helfe ich gerne aus ...

Grüße
rubberman
Member: pablovic
pablovic Mar 06, 2017 at 07:26:57 (UTC)
Goto Top
Danke rubberman, das wars.
Genug Anführungszeichen und es funktioniert, hätte ich auch selbst drauf kommen können.

Danke auch emeriks für die Unterstützung

Gruss
P
Member: rubberman
rubberman Mar 06, 2017 at 18:08:31 (UTC)
Goto Top
hätte ich auch selbst drauf kommen können.
Zu deiner Ehrenrettung - nicht so ohne Weiteres face-wink Selbst wenn man dahinter gestiegen ist, dass der Aufruf per CMD /C erfolgt, ist die Syntax mit dem zusätzlichen Paar Anführungszeichen gewöhnungsbedürftig.

Grüße
rubberman