[C++] Alternativen zu system()?

TheShooter

Lt. Junior Grade
Registriert
Juni 2011
Beiträge
370
Hi,
ich benutze in meinem Programm die Funktion "system()", um ein externes Programm aufzurufen.
Code:
system(NOTEPAD); //Pfad wurde vorher definiert

Allerdings friert mein Programm während der Laufzeit von Notepad ein, es arbeitet erst weiter, wenn ich Notepad geschlossen habe. Deshalb bin ich auf der Suche nach einer Alternative, die es erlaubt multiple Programme gleichzeitig aufzurufen. Zusätzlich habe ich gehört, dass "system()" böse sein soll. Mit Google habe ich nur exec-Befehle gefunden, die mein Compiler leider nicht erkennt. (Visual C++ 2010 Express)

Wäre sehr dankbar für Hilfe. :)

MfG,
TheShooter :-)

PS: Ich habe mir das FAQ durchgelesen, aber leider nichts brauchbares zu diesem Thema gefunden.

PPS: Es wäre sehr hilfreich, wenn ihr mögliche Alternativen gleich mit Parametern angebt. :D
 
Vielen Dank für die Antwort. Kann ShellExecute denn was mit strings anfangen? Oder gibts es da limitierungen? Muss es z.B. ein char sein, oder geht auch ein AnsiString?
 
Es Gibt ShellExecuteA und ShellExecuteW. Wenn du Unicode eingestellt hast dann kannste ja mit
ShellExecute(NULL, NULL, L"C:\\wasweisich.exe"...);
Konvertieren oder einfach
ShellExecuteA(NULL, NULL, "C:\\wasweisich.exe"...);

Ich Programmier immer mit dem Ansi Zeichensatz. und Strings Kannste ja sowieso Konvertieren in welche Form du willst.

LG Tigerass
 
Leider funktioniert das nicht so, wie ich mir das vorgestellt habe. Ich versuche das Programm "Steam.exe" mit dieser Codezeile aufzurufen:

Code:
ShellExecute(NULL, NULL, "C:/Program Files (x86)/Steam/steam.exe", NULL, NULL, SW_SHOWNORMAL);

Aber leider bekomme ich folgenden Compile-Error:

(121): error C2664: 'ShellExecuteW' : cannot convert parameter 3 from 'const char [39]' to 'LPCWSTR'

Was ist da das Problem? Vielleicht hat das was mit den Leerzeichen zutun? Macht ja bekanntlich öfters Probleme...

EDIT:

Ah, lese erst jetzt deine Ergänzung. Das "L" hat gefehlt, jetzt klappts wunderbar. :) Vielen Dank nochmal!
 
Zuletzt bearbeitet:
Dein Compiler motzt, weil du dein Programm als UNICODE-Anwendung konfiguriert hast. Damit zeigt das Makro ShellExecute dann auf die Funktion ShellExecuteW() (in einem Multi-Byte-Character Build würde sie stattdessen auf ShellExecuteA() verweisen).

Die ShellExecuteW()-Funktion erwartet an der kritischen Stelle einen wide-character string (also const TCHAR*). Du übergibst ihr aber einen pupsnormalen const char* string. Um das jetzt zu beheben, packst du den String-Literal einfach in ein TEXT-Makro (das würde dann auch für nicht-UNICODE-Builds klappen), oder du stellst ein führendes L voran:


Code:
// besser
ShellExecute(NULL, NULL, TEXT( "C:/Program Files (x86)/Steam/steam.exe" ), NULL, NULL, SW_SHOWNORMAL);

// oder ... (geht auch, ist aber nicht so flexibel)
ShellExecute(NULL, NULL, L"C:/Program Files (x86)/Steam/steam.exe", NULL, NULL, SW_SHOWNORMAL);
 
Bitte zu beachten, dass Verzeichnisse unter Windows mit "\\" und nicht mit "/" getrennt werden!
 
Zurück
Oben