@Sugrue के रूप में मैं एक पुराना धागा भी खोद रहा हूं।
यह समझाने के लिए कि 32768 क्यों है (मुझे लगता है कि यह 32767 होना चाहिए, लेकिन प्रायोगिक परीक्षण परिणाम पर विश्वास करने देता है) वर्ण सीमाएं जिसे हमें विंडोज एपीआई में खोदने की आवश्यकता है।
कोई भी बात नहीं है कि आप कमांड लाइन के तर्कों के साथ प्रोग्राम कैसे लॉन्च करते हैं, यह ShellExecute , CreateProcess या किसी भी संस्करण में विस्तारित है। ये API मूल रूप से अन्य NT स्तर API को लपेटते हैं जो आधिकारिक रूप से प्रलेखित नहीं हैं। जहाँ तक मुझे पता है ये कॉल NtCreateProcess को लपेटते हैं , जिसके लिए पैरामीटर के रूप में OBJECT_ATTRIBUTES संरचना की आवश्यकता होती है , उस संरचना को बनाने के लिए InitializeObjectAttributes का उपयोग किया जाता है। इस जगह में हम देखते हैं UNICODE_STRING
। तो अब इस संरचना पर एक नज़र डालते हैं:
typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING;
यह USHORT
लंबाई को संग्रहीत करने के लिए (16-बिट लंबाई [0; 65535]) चर का उपयोग करता है । और अनुसार इस लंबाई बाइट्स, नहीं अक्षरों में आकार इंगित करता है। तो हमारे पास है: 65535 / 2 = 32767
(क्योंकि WCHAR
2 बाइट्स लंबी हैं)।
इस संख्या में खुदाई करने के लिए कुछ कदम हैं, लेकिन मुझे उम्मीद है कि यह स्पष्ट है।
इसके अलावा, @sunetos का समर्थन करने के लिए जो स्वीकार किया जाता है। 8191 एक अधिकतम संख्या है जिसे प्रवेश करने की अनुमति है cmd.exe
, यदि आप इस सीमा से अधिक हो जाते हैं, तो The input line is too long.
त्रुटि उत्पन्न होती है। इसलिए, उत्तर इस तथ्य के बावजूद सही है कि cmd.exe
नई प्रक्रिया के लिए तर्क पारित करने का एकमात्र तरीका नहीं है।