Як @Sugrue, я також викопував стару нитку.
Щоб пояснити, чому існує 32768 (я думаю, що це повинно бути 32767, але давайте віримо результату експериментального тестування) обмеження символів нам потрібно зануритися в API Windows.
Незалежно від того, як ви запускаєте програму з аргументами командного рядка, вона переходить до ShellExecute , CreateProcess або будь-якої розширеної їх версії. Ці API в основному містять інший API рівня NT, який офіційно не зафіксований. Наскільки мені відомо, ці виклики обгортають NtCreateProcess , який вимагає структури OBJECT_ATTRIBUTES в якості параметра, для створення цієї структури використовується InitializeObjectAttributes . У цьому місці ми бачимо UNICODE_STRING
. Тому тепер давайте розглянемо цю структуру:
typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING;
Він використовує USHORT
змінну (16-бітну довжину [0; 65535]) для збереження довжини. І відповідно до цього , довжина вказує розмір у байтах, а не символи. Отже, у нас є: 65535 / 2 = 32767
(бо WCHAR
2 байти завдовжки).
Є кілька кроків, щоб розібратися в цій кількості, але, сподіваюся, це зрозуміло.
Крім того, щоб підтримати @sunetos відповісти, що прийнято. 8191 - максимальна кількість, яку можна ввестиcmd.exe
, якщо ви перевищуєте цю межу, The input line is too long.
створюється помилка. Отже, відповідь правильна, незважаючи на те, що cmd.exe
це не єдиний спосіб передавати аргументи для нового процесу.