2013-08-16 5 views
19

WinAPI पर, HANDLE प्रकार void* के रूप में परिभाषित किया गया है, इस प्रकार 64 बिट अनुप्रयोग पर HANDLE मान 0 से 18446744073709551615 तक हो सकता है। लेकिन क्या यह अभ्यास में सच है? क्या कोई दस्तावेज ऐसे HANDLE की अभिन्न सीमा निर्दिष्ट करता है?64 बिट्स एप्लिकेशन पर विंडोज हैंडल की सीमा क्या है?

यदि उदाहरण के लिए कोई इस HANDLE को 32 बिट एप्लिकेशन पर int32_t के रूप में स्टोर करना चाहता है जो पूरी तरह से ठीक है, लेकिन 64 बिट एप्लिकेशन पर संदेह चिपक जाता है।

+2

_Why_ आप एक 'int' में एक' HANDLE' स्टोर करने के लिए की जरूरत है? समस्याग्रस्त लगता है। एक 'std :: मानचित्र ' पर विचार करें। – MSalters

+0

@MSalters जो POSIX फ़ाइल डिस्क्रिप्टर से संबंधित है (जो 'int' हैं)। मैं सी का उपयोग कर रहा हूं, इसलिए कोई एसटीएल नहीं है, लेकिन हाँ, मैं एक दूसरा हैंडल सिस्टम बना सकता हूं जो विंडोज़ हैंडल को इंगित करता है, लेकिन यह एक साधारण कलाकार से धीमा होगा, इसलिए मैं यहां पूछ रहा हूं। – thelink2012

उत्तर

19

MSDN कहता है: Windows के

64-बिट संस्करण 32-बिट अंतर के लिए हैंडल का उपयोग करें। 32-बिट और 64-बिट अनुप्रयोगों के बीच एक हैंडल साझा करते समय, केवल कम 32 बिट्स महत्वपूर्ण हैं, इसलिए हैंडल (64-बिट से 32-बिट तक इसे पास करते समय) को साइन करना सुरक्षित है या साइन-विस्तार हैंडल (32-बिट से 64-बिट तक इसे पास करते समय)। हैंडल जिन्हें साझा किया जा सकता है में विंडोज़ (एचडब्ल्यूएनडी) जैसे उपयोगकर्ता ऑब्जेक्ट्स को हैंडल शामिल हैं, जीडीआई ऑब्जेक्ट्स जैसे पेन और ब्रश (एचबीआरयूएसएच और एचपीईएन) को संभाला जाता है, और पर म्यूटेक्स, सेमफोर और फ़ाइल हैंडल जैसी वस्तुओं को नामित करता है।

यह भी इस टिप्पणी कि पृष्ठ पर जोड़ा ध्यान देने योग्य है:

प्रक्रिया सीमाओं के पार ऐसे हैंडल साझा करने के लिए उचित तरीका है शून्य का विस्तार 32 बिट से 64 बिट्स, या इसके विपरीत द्वारा करने के लिए हैंडल छिड़काव 64 बिट शीर्ष बिट्स को छोड़कर 32 बिट्स को संभालते हैं।

एक संभाल "शून्य-विस्तार" एक हैंडल बनाम "साइन-विस्तार" के बीच भेद को ध्यान दें।

संपादित करें: इस सवाल का कोई हटाया गया जवाब में देखा चर्चा से परखने के बाद, मुझे लगता है कि साइन-विस्तार एक 32-बिट संभाल एक 64-बिट पर पहुंचने के लिए के बजाय संभाल शून्य का विस्तार यह करने के लिए है का महत्व एक हैंडल के लिए INVALID_HANDLE_VALUE मान का उचित उपचार बनाए रखें।

https://msdn.microsoft.com/en-us/library/windows/desktop/aa384203%28v=vs.85%29.aspx

+1

जिस टिप्पणी पर आप भरोसा कर रहे हैं उसका शून्य अधिकार है। दस्तावेज़ीकरण का पालन करें। –

+1

इसके अलावा, आपके पास इस पृष्ठ पर सबसे ज्यादा मतदान किए गए उत्तर को देखने के लिए पर्याप्त प्रतिष्ठा है (जिसमें से हटाना संदिग्ध है) जिसमें इसे शामिल किया गया था, और जहां एमएसल्टर्स ने टिप्पणियों में भी भाग लिया था। –

+1

@BenVoigt वर्तमान में मेरे पास हटाए गए उत्तर को देखने की यह क्षमता नहीं है * (भयानक, उसे नहीं पता था) * लेकिन इसे हटाए जाने से पहले स्वीकार्य उत्तर था, कारण के लिए कोई विचारधारा? शायद टिप्पणियों पर? जिज्ञासा से बाहर, अगर लेखक चाहता है तो undelete संभव है? – thelink2012

2

मुझे पता है कि यह कहां दस्तावेज है, लेकिन मेरा एक सहयोगी जोर देता है कि 64-बिट एचडब्ल्यूएनडी हैंडल हमेशा 32-बिट्स में फिट होते हैं। मैंने कभी ऐसा मामला नहीं देखा है जहां यह सत्य नहीं है, लेकिन भविष्य से बात नहीं कर सकता है या जहां इसे दस्तावेज किया गया है। कहने वाले अन्य हैंडल के बारे में, HTREEITEM .... वे 64-बिट्स पूर्ण हैं और मैं इस धारणा से थोड़ा सा हूं कि वे 32 बिट्स में भी फिट बैठते हैं।

+1

"मेरा एक सहयोगी" जानकारी का एक विश्वसनीय स्रोत नहीं है, विशेष रूप से आधिकारिक दस्तावेज (स्वीकृत उत्तर देखें) पर असहमत है। –

+0

@ बाउंडरीइम्पोजिशन, जो विल्कोक्सन सही है। 64-बिट प्रक्रिया से HTREEITEMs 32-बिट्स से बहुत आसानी से बड़े हो सकते हैं। यह माइक्रोसॉफ्ट डॉक्स में भी कहा गया है, विशेष रूप से ओएस ऑब्जेक्ट्स को संभालने के लिए 32-बिट होगा, और विस्तार पर हस्ताक्षर करने के लिए, लेकिन इसमें अन्य प्रकार के हैंडल जैसे HTREEITEM शामिल नहीं हैं।शायद उसका सहयोगी माइक्रोसॉफ्ट के लिए काम करता है। उनके लिए +1 इस बहुत उपयोगी पहलू का जिक्र है। मैं उस पर घूर रहा हूं जो प्रेषण के माध्यम से हैंडल के 3 निबल्स को 64-बिट प्रक्रिया में अभी-अभी कर देता है। – Celess

+0

@ जो विल्कोक्सन 32-बिट और 64-बिट इंटरऑपरेबिलिटी (एमएसडीएन): https://msdn.microsoft.com/en-us/library/windows/desktop/ee872017(v=vs.85).aspx – Celess

संबंधित मुद्दे