Como @Sugrue, también estoy desenterrando un viejo hilo.
Para explicar por qué hay 32768 (creo que debería ser 32767, pero creamos el resultado de las pruebas experimentales) limitación de caracteres, necesitamos profundizar en la API de Windows.
No importa cómo inicie el programa con argumentos de línea de comando, va a ShellExecute , CreateProcess o cualquier versión extendida. Estas API básicamente envuelven otras API de nivel NT que no están documentadas oficialmente. Hasta donde yo sé, estas llamadas envuelven NtCreateProcess , que requiere la estructura OBJECT_ATTRIBUTES como parámetro, para crear esa estructura se usa InitializeObjectAttributes . En este lugar vemos UNICODE_STRING. Así que ahora echemos un vistazo a esta estructura:
typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING;
Utiliza la USHORTvariable (longitud de 16 bits [0; 65535]) para almacenar la longitud. Y de acuerdo con esto , la longitud indica el tamaño en bytes, no en caracteres. Entonces tenemos: 65535 / 2 = 32767(porque WCHARtiene 2 bytes de longitud).
Hay algunos pasos para profundizar en este número, pero espero que esté claro.
Además, para apoyar @sunetos responde lo que se acepta. 8191 es un número máximo que se puede ingresar cmd.exe, si excede este límite, The input line is too long.se genera un error. Entonces, la respuesta es correcta a pesar de que cmd.exeno es la única forma de pasar argumentos para un nuevo proceso.