Comme @Sugrue, je déterre aussi un vieux fil.
Pour expliquer pourquoi il y a une limitation de 32768 (je pense que ce devrait être 32767, mais croyons aux résultats des tests expérimentaux) caractères, nous devons creuser dans l'API de Windows.
Quelle que soit 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 recouvrent essentiellement d'autres API de niveau NT qui ne sont pas officiellement documentées. Pour autant que je sache, ces appels enveloppent NtCreateProcess ce qui nécessite ATTRIBUTS DE L'OBJET en tant que paramètre, pour créer cette structure InitializeObjectAttributes est utilisé. A cet endroit, nous voyons UNICODE_STRING
. Jetons maintenant un coup d'œil à cette structure :
typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING;
Il utilise USHORT
(longueur de 16 bits [0 ; 65535]) pour stocker la longueur. Et selon este La longueur indique la taille en octets, et non en caractères. Nous avons donc : 65535 / 2 = 32767
(parce que WCHAR
a une longueur de 2 octets).
Il y a quelques étapes pour creuser ce chiffre, mais j'espère qu'il est clair.
Aussi, pour soutenir @sunetos répondre à ce qui est accepté. 8191 est un nombre maximum autorisé à être entré dans la base de données. cmd.exe
si vous dépassez cette limite, The input line is too long.
est générée. Donc, la réponse est correcte malgré le fait que cmd.exe
n'est pas le seul moyen de passer des arguments pour un nouveau processus.