C++ Batchbefehl in C++ mit Parameter übergeben

Maysi2k

Captain
Registriert
Sep. 2006
Beiträge
3.425
Hallo *,

ich bin etwas eingerostet was C++ angeht :D

Aktuell bin ich dabei ein kleines Programm zu schreiben. Diese Programm soll ein anders Programm mit einem Parameter öffnen. Das ganze möchte ich mit der Systemklasse öffnen.

Beispiel:

Code:
system("notepad.exe");

Allerdings habe ich einen Pfad mit Leerzeichen sowie einen Parameter den ich übergebe:

Code:
system("c:\Programe x86\bla\bla.exe /d /H /u");

natürlich geht der Befehl so nicht, ich habe nun via Google schon viele Version mit \ und "" gefunden, aber keins davon fruchtet.

Könnt Ihr mir sagen wie ich den Pfad mit Leerzeichen und dem Parameter öffnen kann?

Vielen Dank.
 
Maysi2k schrieb:
natürlich geht der Befehl so nicht, ich habe nun via Google schon viele Version mit \ und "" gefunden, aber keins davon fruchtet.

Könnt Ihr mir sagen wie ich den Pfad mit Leerzeichen und dem Parameter öffnen kann?

Vielen Dank.

Code:
const int retVal = std::system( "\"c:\\Programe x86\\bla\\bla.exe\\" /d /H /u" );

Habe ich jetzt nicht getestet, sollte aber meiner Meinung nach funktionieren. Wobei es natürlich nicht so prall ist, hardkodierte Pfadnamen zu verwenden.
 
Zuletzt bearbeitet: (miac hat Recht: Backslashes müssen natürlich escape'd werden)
Ich denke, das Problem ist eher das Escape Zeichen:

system("c:\\Programe x86\\bla\\bla.exe /d /H /u");
 
miac schrieb:
Ich denke, das Problem ist eher das Escape Zeichen:

system("c:\\Programe x86\\bla\\bla.exe /d /H /u");

Oh Mann, da hast du natürlich völlig Recht. Die Backslashes gehören anständig escape'd. :o
 
system() ist übrigens keine Klasse und ShellExecute gibt es nur unter Windows. Zusammen mit dem hartgecodeten Pfad ist Letzteres natürlich nicht das wirkliche Problem, wollte es aber zumindest erwähnen.

Und da du sowieso für Windows entwickelst, nimm doch bitte sowas wie ShGet(Known)FolderPath().
 
So guten Morgen erst einmal,

Das hier:
Code:
system("c:\\Programe x86\\bla\\bla.exe /d /H /u");
funktioniert nicht.

Es kommt: Eingabefehler "C:\Programme" hat keine Dateierweitung.

In der ursprünglichen Batchdatei, übergebe ich den Pfad ja mit ", aber das geht in C++ nicht.
 
Hast du den Post von antred gelesen?
Code:
system("\"c:\\Programe x86\\bla\\bla.exe\" /d /H /u");
Mit ShellExecute bräuchtest du den Hick Hack nicht machen.
 
Es gibt dafür eine Win32API-Funktion. SHGetKnownFolderPath() oder so. Nachgucken ist gerade unbequem, weil Ich im Bus sitze. Damit muss man keine Leerzeichen escapen und man bekommt immer den richtigen Pfad, egal wie er heißt.

€: Nachgelesen. Funktionsname ist richtig. Und man sollte auf keine Andere Weise versuchen, auf Standardverzeichnisse zuzugreifen. Der Benutzer kann sie teilweise verschieben oder Microsoft könnte im nächsten Windowspatch andere Namen vergeben.
 
Zuletzt bearbeitet:
Solche Verzeichnisse sind auch in den Umgebungsvariablen vorhanden oder man ermitteln Sie durch einen entsprechenden API Aufruf.

Ich kann verstehen, wenn der TE nur die System-Standard Funktionen benutzen will, um den Overhead und die verwendeten Lib's klein zu halten.

Gerade C ist ja für große exe bekannt, wenn man nicht aufpaßt und alles aus Allem zusammenfrickelt.
 
Die Bibliotheken, die die Win32-API implementieren, werden standardmäßig dynamisch geladen. Da müsste OP ausdrücklich einstellen, dass er das nicht will. Außerdem sind das Standardfunktionen von Windows. Und Srsly, große binaries mit C? Aber letzteres ist eh egal, denn es geht hier ja um C++
 
asdfman schrieb:
Und Srsly, große binaries mit C? Aber letzteres ist eh egal, denn es geht hier ja um C++

Habe ich jetzt so auch noch nicht gehört. Im Gegenteil, eigentlich stand immer C++ in dem Ruf, größere Binaries zu erzeugen als C (ich glaube, zumindest wenn man iostreams & co verwendet). Ist aber eigentlich in der Regel (auf einem Desktop-PC) auch völlig egal. Mit oder ohne <windows.h> / <iostream>, größer als ein paar hundert kB maximal wird der Unterschied kaum sein.

Auf jeden Fall sollte man in einem Programm niemals hardkodierte Pfadnamen verwenden, wenn man's irgendwie vermeiden kann. Im simpelsten Fall könnte er sein Programm so stricken, daß der Benutzer eben den Pfad zur Notepad.exe als Argument übergeben muß.
 
Zurück
Oben