मैं पी/GetWindowLongPtr और SetWindowLongPtr पर आमंत्रित करना चाहता हूं, और मैं उनके बारे में विवादित जानकारी देख रहा हूं।मैं 32-बिट प्लेटफार्मों पर GetWindowLongPtr और SetWindowLongPtr को कैसे पिन करूं?
कुछ सूत्रों का कहना है कि, 32-बिट प्लेटफार्मों पर, GetWindowLongPtr सिर्फ एक पूर्वप्रक्रमक मैक्रो GetWindowLong कहता है, और GetWindowLongPtr user32.dll में एक प्रविष्टि बिंदु के रूप में मौजूद नहीं है। उदाहरण के लिए:
- pinvoke.net entry for SetWindowLongPtr एक स्थिर विधि है कि IntPtr.Size की जाँच करता है और फिर या तो SetWindowLong या SetWindowLongPtr कहता है, एक टिप्पणी करते हुए कहा कि "विरासत OSes SetWindowLongPtr का समर्थन नहीं करते" के साथ है। "विरासत ओएस" द्वारा क्या मतलब है इसका कोई स्पष्टीकरण नहीं है।
- एक answer on StackOverflow कहता है "32 बिट सिस्टम पर GetWindowLongPtr केवल एक सी मैक्रो है जो GetWindowLong को इंगित करता है"।
तो इन स्रोतों से संकेत मिलता है कि * PTR प्रवेश बिंदुओं बस user32.dll का संस्करण कहते हैं, के साथ जहाज, 32-बिट विंडोज 7
लेकिन मुझे कोई देख में नहीं हैं लगते हैं एमएसडीएन दस्तावेज में इसका संकेत। एमएसडीएन के अनुसार, SetWindowLongPtr सेटविंडोलोंग, सादा और सरल का समर्थन करता है। और SetWindowLongPtr page की आवश्यकता अनुभाग के अनुसार, ऐसा लगता है कि SetWindowLongPtr Windows 2000 (क्लाइंट और सर्वर संस्करण दोनों) के बाद user32.dll में रहा है। फिर, 32-बिट ओएसई में प्रवेश बिंदुओं के गायब होने का कोई उल्लेख नहीं है।
मैं संदिग्ध कि सत्य बीच में कहीं है: कि जब आप सी ++ पुराने OSes (यानी, कुछ है कि Win9x और NT4 पर चलेगा संकलित करने के लिए) को लक्षित करने संकलक बताओ, तो हेडर फाइल SetWindowLongPtr एक के रूप में घोषित मैक्रो जो SetWindowLong को कॉल करता है, लेकिन प्रविष्टि बिंदु शायद Windows 2000 में मौजूद है और बाद में और यदि आप उन प्लेटफ़ॉर्म को लक्षित करने के लिए कंपाइलर को बताते हैं तो आप इसे सीधे (मैक्रो के बजाए) प्राप्त करेंगे। लेकिन यह सिर्फ एक अनुमान है; मेरे पास वास्तव में संसाधनों या जानकारियों को खोदने और सत्यापित करने के लिए नहीं है।
यह भी संभव है कि लक्ष्य प्लेटफ़ॉर्म एक भूमिका निभाता है - यदि आप x86 प्लेटफ़ॉर्म के लिए अपना ऐप संकलित करते हैं, तो आपको 64-बिट ओएस पर SetWindowLongPtr को कॉल नहीं करना चाहिए। दोबारा, मुझे इस सवाल के बारे में सोचने के लिए पर्याप्त पता है, लेकिन मुझे नहीं पता कि जवाब कैसे प्राप्त करें। एमएसडीएन का सुझाव है कि SetWindowLongPtr हमेशा सही है।
क्या कोई मुझे बता सकता है कि क्या यह बस P/Invoc को SetWindowLongPtr पर आमंत्रित करना है और इसके साथ किया जाना चाहिए? (Windows 2000 मान लें और बाद में।) चाहेंगे पी/SetWindowLongPtr को लागू मुझे सही प्रवेश बिंदु दे:
- अगर मैं कोई ऐप्लिकेशन एक 32-बिट OS पर 86 प्लेटफ़ॉर्म लक्ष्यीकरण चला सकता हूँ?
- यदि मैं 64-बिट ओएस पर x86 प्लेटफार्म को लक्षित करने वाला ऐप चलाता हूं?
- यदि मैं 64-बिट ओएस पर x64 प्लेटफार्म को लक्षित करने वाला ऐप चलाता हूं?
आपने यह नहीं कहा कि आपको यह कोड कहां मिला, लेकिन मैंने इसे System.Windows.Forms.UnsafeNativeMethods पर ट्रैक किया। –
@ हंस-पासेंट: कोड के इस बिट के लिए धन्यवाद। यह किसी अन्य संवाद में संवाद मोडल करने के लिए समाधान को कार्यान्वित करने में सहायक था: http://stackoverflow.com/a/16088711/654244 – KyleK
क्या बाद में किसी संभावित त्रुटि को सही तरीके से पुनर्प्राप्त करने के लिए विशेषता में 'SetLastError = true' शामिल नहीं होना चाहिए? –