Как @Sugrue я также выкапываю старую ветку.
Чтобы объяснить, почему существует ограничение на 32768 символов (я думаю, это должно быть 32767, но давайте поверить в результат экспериментального тестирования), нам нужно покопаться в Windows API.
Независимо от того, как вы запускаете программу с аргументами командной строки, она переходит в 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это не единственный способ передать аргументы новому процессу.