Как @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
это не единственный способ передать аргументы новому процессу.