Als @Sugrue grabe ich auch einen alten Thread aus.
Um zu erklären, warum es 32768 (ich denke, es sollte 32767 sein, aber lassen Sie uns das experimentelle Testergebnis glauben) gibt, müssen wir die Windows-API einschränken.
Unabhängig davon , wie Sie ein Programm mit Befehlszeilenargumenten starten, wird es an ShellExecute , CreateProcess oder eine erweiterte Version gesendet . Diese APIs umfassen im Wesentlichen andere NT-APIs, die nicht offiziell dokumentiert sind. Soweit ich weiß, wird in diesen Aufrufen NtCreateProcess umbrochen , für das die Struktur OBJECT_ATTRIBUTES als Parameter erforderlich ist. InitializeObjectAttributes wird verwendet. An diesem Ort sehen wir UNICODE_STRING
. Schauen wir uns nun diese Struktur an:
typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING;
Es verwendet USHORT
(16-Bit - Länge [0; 65535]) Variablen zu speichern Länge. Und nach dieser zeigt Länge Größe in Bytes, nicht Zeichen. Wir haben also: 65535 / 2 = 32767
(weil WCHAR
es 2 Bytes lang ist).
Es gibt ein paar Schritte, um diese Zahl zu untersuchen, aber ich hoffe, es ist klar.
Um @sunetos zu unterstützen, antworten Sie auch, was akzeptiert wird. 8191 ist eine maximale Anzahl, die eingegeben werden cmd.exe
darf. Wenn Sie diesen Grenzwert überschreiten, wird ein The input line is too long.
Fehler generiert. Die Antwort ist also richtig, obwohl dies cmd.exe
nicht die einzige Möglichkeit ist, Argumente für einen neuen Prozess zu übergeben.