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