Jako @Sugrue również wykopuję stary wątek.
Aby wyjaśnić, dlaczego istnieje 32768 (myślę, że powinno być 32767, ale uwierzmy w wynik testów eksperymentalnych) ograniczenie znaków, musimy zagłębić się w Windows API.
Bez względu na to, jak uruchomisz program z argumentami wiersza poleceń, trafi on do ShellExecute , CreateProcess lub dowolnej rozszerzonej ich wersji. Te interfejsy API zasadniczo opakowują inne API poziomu NT, które nie są oficjalnie udokumentowane. O ile wiem, te wywołania zawijają NtCreateProcess , który wymaga struktury OBJECT_ATTRIBUTES jako parametru, do utworzenia tej struktury jest używany InitializeObjectAttributes . W tym miejscu widzimy UNICODE_STRING
. Przyjrzyjmy się teraz tej strukturze:
typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING;
Używa USHORT
zmiennej (długość 16-bitowa [0; 65535]) do przechowywania długości. I zgodnie z tym długość wskazuje rozmiar w bajtach, a nie w znakach. Mamy więc: 65535 / 2 = 32767
(ponieważ WCHAR
ma 2 bajty).
Jest kilka kroków, aby zagłębić się w ten numer, ale mam nadzieję, że jest jasny.
Ponadto, aby wspierać @sunetos, odpowiedz, co jest akceptowane. 8191 to maksymalna dozwolona liczba cmd.exe
, jeśli przekroczysz ten limit, The input line is too long.
zostanie wygenerowany błąd. Tak więc odpowiedź jest prawidłowa, mimo że cmd.exe
nie jest to jedyny sposób przekazywania argumentów za nowym procesem.