Die WinAPI existiert in zwei Ausführungen, eine für ASCII (A) und eine für Wide-Characters (W). Jenachdem für welche WinAPI dein Projekt kompiliert wird, wählt die Windows.h (und alle unter-dateien dieser) die passenden Funktionen für A oder W aus.
Wird ein Projekt für ASCII kompiliert, wird CreateProcess zur CreateProcessA und der erste Parameter ist dann vom Typ LPCSTR (aka. "const char*"). Für Wide-Characters wird CreateProcessW verwendet und hier kommt dann der LPCWSTR (aka. "const wchar_t*") zum Einsatz.
Das macht auch Sinn, denn bei ASCII sind schließlich die Zeichen durch ein einziges Byte beschrieben, während Wide-Characters pro Zeichen zwei Byte verwendet.
Wird dein Projekt für Wide-Characters kompiliert, dann werden nicht automatisch alle Zeichenketten zu Wide-Characters. Denn ASCII-Zeichenketten sind ja ebenso erlaubt, funktionieren nur meist nicht mehr ohne Umwege mit der WinAPI. Daher bleiben alle Zeichenketten ASCII und du als Entwickler musst definieren, welche Zeichenketten nun zu Wide-Characters werden müssen.
Das tust du mit dem vorangestellten L. Naturlich hat das einige Nachteile, schließlich ist dein Projekt jetzt fest auf Wide-Characters (oder ASCII) entwickelt und kann nicht so ohne weiteres anders kompiliert werden. Wie viel Sinn es macht, ein Projekt zwischen ASCII und Wide-Characters wechseln zu lassen, sei mal da hingestellt, aber Microsoft hat dafür einen Ausweg gefunden.
Mit dem Makro "TEXT" entscheidet die WinAPI für dich, ob nun ein L vor deinen String kommt, oder nicht.
Code:
MessageBox(0, TEXT("Titel"), TEXT("Hallo Welt!"), MB_OK);
Zum Escaping
Generell müssen bei Windows Whitespaces
immer extra gequotet werden. Unzählbar viele Programme, auch von Microsoft selbst, weisen zum Teil fatale Schwachstellen auf, nur weil an dieser stelle geschlampt wurde.
Das Problem hierbei ist, dass der Interpreter für den Aufruf des Programms so ausgelegt ist, dass nach dem ersten "echten" Whitespace der Pfad zum Programm abgeschlossen ist und danach die Parameter kommen.
Das hier klappt noch.
Code:
C:\test.exe arg1 arg2 arg3
Das hier gibt schon Probleme
Code:
C:\mein test.exe arg1 arg2 arg3
Der Interpreter liest hier "Programm ist C:\mein mit den Parametern test.exe arg1 arg2 arg3"
Gelöst wird das in der Regel so:
Code:
"C:\mein test.exe" arg1 arg2 arg3
(Ob man Whitespaces auch escapen kann, weiß ich nicht. Unter Linux gehts jedenfalls, unter Windows bekomm ichs gar nich hin. Vielleicht gibts da en Trick ...). Jedenfalls ist das die Lösung, die alle verwenden wenn sie Leerzeichen im Pfad haben oder erwarten.
CreateProcess stellt hier ein Ausnahme da, denn: Hier wird der Name zur ausführbaren Datei explizit angegeben, getrennt von den Parametern. Hier liegt es damit an der WinAPI, das "Beste" draus zu machen.