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-ID: 330919

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

Ausgedruckt am: 01.11.2024 um 02:11 Uhr

emeriks
emeriks 02.03.2017 um 13:30:00 Uhr
Goto Top
Hi,
Du musst schon nach dem ".exe" ein " einfügen, nicht erst am Ende.

E.
132272
132272 02.03.2017, aktualisiert am 03.03.2017 um 09:22:37 Uhr
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ß
pablovic
pablovic 02.03.2017 um 14:00:57 Uhr
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;
}
emeriks
emeriks 02.03.2017 aktualisiert um 14:07:57 Uhr
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"!
pablovic
pablovic 02.03.2017 um 14:11:26 Uhr
Goto Top
Ja sorry hatte ich im Quellcode schon so angepasst, aber beim ersetzen von oben kopiert.
emeriks
emeriks 02.03.2017 um 14:16:29 Uhr
Goto Top
Lass Dir doch in Zeile 23 den Befehl ausgeben, statt ihn auszuführen. Was kommt dann dabei raus?
pablovic
pablovic 02.03.2017 um 14:29:43 Uhr
Goto Top
"C:\Program Files (x86)\Anwendung XY\Anwendung.exe" "asdf" "asdf"
emeriks
emeriks 02.03.2017 um 14:33:35 Uhr
Goto Top
Und wenn Du das so in einer CMD eingibst, dann startet das Programm wir gewünscht?
pablovic
pablovic 02.03.2017 um 14:42:20 Uhr
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?
emeriks
emeriks 02.03.2017 um 15:27:38 Uhr
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(...);"
pablovic
pablovic 02.03.2017 um 16:34:58 Uhr
Goto Top
Danke
rubberman
Lösung rubberman 02.03.2017 um 23:12:45 Uhr
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
pablovic
pablovic 06.03.2017 um 08:26:57 Uhr
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
rubberman
rubberman 06.03.2017 um 19:08:31 Uhr
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