En tant que @Sugrue, je suis également en train de creuser un vieux fil.
Pour expliquer pourquoi il y a 32768 (je pense que cela devrait être 32767, mais croyons le résultat des tests expérimentaux), nous devons creuser dans l'API Windows.
Peu importe la façon dont vous lancez le programme avec des arguments de ligne de commande, il va à ShellExecute , CreateProcess ou à toute autre version étendue. Ces API englobent essentiellement d'autres API de niveau NT qui ne sont pas officiellement documentées. Autant que je sache, ces appels enveloppent NtCreateProcess , qui nécessite la structure OBJECT_ATTRIBUTES en tant que paramètre, pour créer cette structure, InitializeObjectAttributes est utilisé. Dans cet endroit, nous voyons UNICODE_STRING
. Alors maintenant, jetons un œil à cette structure:
typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING;
Il utilise la USHORT
variable (longueur 16 bits [0; 65535]) pour stocker la longueur. Et selon cela , la longueur indique la taille en octets, pas en caractères. Nous avons donc: 65535 / 2 = 32767
(car il WCHAR
fait 2 octets de long).
Il y a quelques étapes pour creuser ce nombre, mais j'espère que c'est clair.
Aussi, pour soutenir @sunetos, répondez à ce qui est accepté. 8191 est un nombre maximum autorisé à entrer cmd.exe
, si vous dépassez cette limite, une The input line is too long.
erreur est générée. Donc, la réponse est correcte malgré le fait que ce cmd.exe
n'est pas la seule façon de passer des arguments pour un nouveau processus.