Como @Sugrue, também estou descobrindo um tópico antigo.
Para explicar por que há 32.768 (acho que deveria ser 32.767, mas vamos acreditar no resultado do teste experimental) limitação de caracteres, precisamos examinar a API do Windows.
Não importa como você inicia o programa com argumentos de linha de comando, ele vai para ShellExecute , CreateProcess ou qualquer versão estendida. Essas APIs basicamente envolvem outras APIs de nível NT que não estão oficialmente documentadas. Pelo que eu sei, essas chamadas envolvem NtCreateProcess , que requer a estrutura OBJECT_ATTRIBUTES como um parâmetro, para criar essa estrutura InitializeObjectAttributes é usada. Neste lugar nós vemos UNICODE_STRING
. Então, agora vamos dar uma olhada nesta estrutura:
typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING;
Ele usa USHORT
a variável (comprimento de 16 bits [0; 65535]) para armazenar o comprimento. E, de acordo com isso , o comprimento indica o tamanho em bytes, não em caracteres. Portanto, temos: 65535 / 2 = 32767
(porque WCHAR
tem 2 bytes de comprimento).
Existem algumas etapas para analisar esse número, mas espero que esteja claro.
Além disso, para apoiar @sunetos responda o que é aceito. 8191 é um número máximo permitido para ser inserido cmd.exe
, se você exceder esse limite, um The input line is too long.
erro será gerado. Portanto, a resposta está correta apesar de cmd.exe
não ser a única forma de passar argumentos para um novo processo.