Như @Sugrue, tôi cũng đang tìm một chủ đề cũ.
Để giải thích tại sao có giới hạn ký tự 32768 (tôi nghĩ nó phải là 32767, nhưng hãy tin vào kết quả kiểm tra thử nghiệm), chúng ta cần tìm hiểu kỹ về Windows API.
Bất kể bạn khởi chạy chương trình bằng các đối số dòng lệnh như thế nào, nó sẽ chuyển đến ShellExecute , CreateProcess hoặc bất kỳ phiên bản mở rộng nào của chúng. Các API này về cơ bản bao bọc các API cấp NT khác không được ghi nhận chính thức. Theo như tôi biết các cuộc gọi này bao bọc NtCreateProcess , yêu cầu cấu trúc OBJECT_ATTRIBUTES làm tham số, để tạo cấu trúc đó thì dùng InitializeObjectAttributes . Ở nơi này chúng ta thấy UNICODE_STRING
. Vì vậy, bây giờ chúng ta hãy xem xét cấu trúc này:
typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING;
Nó sử dụng biến USHORT
(độ dài 16-bit [0; 65535]) để lưu trữ độ dài. Và theo điều này , chiều dài cho biết kích thước tính bằng byte, không phải ký tự. Vì vậy, chúng ta có: 65535 / 2 = 32767
(vì WCHAR
dài 2 byte).
Có một vài bước để tìm hiểu con số này, nhưng tôi hy vọng nó rõ ràng.
Ngoài ra, để hỗ trợ @sunetos trả lời những gì được chấp nhận. 8191 là số tối đa được phép nhập vào cmd.exe
, nếu bạn vượt quá giới hạn này, The input line is too long.
lỗi sẽ được tạo ra. Vì vậy, câu trả lời là đúng mặc dù thực tế đó cmd.exe
không phải là cách duy nhất để chuyển các đối số cho quy trình mới.