2010-11-30 17 views
12

पहला पृष्ठभूमि प्रश्न:int बनाम IntPtr जब आपके पास हैंडल है?

सामान्यतः, int और IntPtr के बीच क्या अंतर है? मेरा अनुमान है कि यह int या byte जैसे मान के बजाय वास्तविक वस्तु है। मान लें कि यह सच है:

तो वे समान नहीं हैं। फिर भी मैं दोनों के रूप में प्रतिनिधित्व हैंडल देखता हूं।

  1. IntPtr: Control.Handle
  2. पूर्णांक (या uint): एक PInvoke एक int वापस जाने के लिए सेटअप किया जा सकता है और यह सिर्फ ठीक काम करता है:

    [DllImport("coredll.dll", SetLastError = true)] 
    public static extern int GetForegroundWindow(); 
    private string GetActiveWindow() 
    { 
        const int nChars = 256; 
        int handle = 0; 
        StringBuilder Buff = new StringBuilder(nChars); 
    
        handle = CoreDLL.GetForegroundWindow(); 
    
        if (CoreDLL.GetWindowText(handle, Buff, nChars) > 0) 
        { 
         return Buff.ToString(); 
        } 
    
        return ""; 
    } 
    

तो, int बनाम IntPtr? क्या यह हैंडल के लिए मायने रखता है? क्या आप या तो इस्तेमाल कर सकते हैं?

उत्तर

27

int 32 बिट लंबा है। IntPtr आपके वास्तुकला के लिए एक सूचक के रूप में लंबे समय तक है। इसलिए, एक सूचक को int में केवल 32 बिट सिस्टम पर संग्रहीत किया जा सकता है, जबकि यह हमेशाIntPtr में संग्रहीत किया जा सकता है।

सूचना है कि अपने उदाहरण "एक वापसी मान के रूप में पूर्णांक" करता है नहीं एक int का उपयोग एक सूचक धारण करने के लिए, लेकिन सिर्फ एक संख्यात्मक मान के लिए। इसका मतलब यह नहीं है कि int स्वचालित रूप से सही आकार है हालांकि: उस पी/आमंत्रण हस्ताक्षर के लेखक GetForegroundWindow के लिए प्रलेखन में गए होंगे और देखें कि यह HWND देता है।

फिर, प्लेटफार्म एसडीके में windef.h (या this MSDN page) से हम देख सकते हैं कि एक HWND एक HANDLE जो एक PVOID है जो एक सूचक है ... है!

इसलिए, जहाँ तक मैं बता सकता हूँ, कि हस्ताक्षर गलत है, के रूप में GetForegroundWindow की वापसी मान के आकार वास्तुकला पर निर्भर करता है। इस प्रकार, यह IntPtr भी होना चाहिए।

अद्यतन:

यह ऊपर से अनुमान लगाया जा सकता है, मुझे लगता है कि यह स्पष्ट रूप से कहना है कि सार्थक है:

  • ग़लती से int के बजाय कभी नहीं का उपयोग कर IntPtr में 32-बिट अनुप्रयोगों होगा एक समस्या का कारण बनता है, भले ही वे 64-बिट विंडोज़ पर चलें; चूंकि अधिकांश समय इस समय 32-बिट हैं, इससे आपको ऐसी गलतियों को दूर करने में मदद मिलेगी।
  • ग़लती से 64 बिट अनुप्रयोगों में int बजाय IntPtr का उपयोग कर इसकी गारंटी नहीं है समस्याओं का कारण है, क्योंकि यह बहुत संभव है कि व्यवहार में मूल्यों int के 32 बिट में फिट होगा का सामना करना पड़ा जा रहा है। यह संभावना को कम करता है कि एक गलती एक अनुप्रयोग त्रुटि के रूप में प्रकट होगी।

    1. एक int प्रयोग किया जाता है, जहां एक IntPtr होना चाहिए:

इसलिए, एक त्रुटि के लिए करने के लिए वास्तव में प्रकट वहाँ तीन शर्तें हैं कि एक ही समय में संतुष्ट हो रहे हैं।

  • निष्पादन योग्य छवि 64-बिट है।
  • कुछ PInvoke कॉल द्वारा लौटाया गया मूल्य और int के रूप में संग्रहीत एक मूल्य 32 बिट्स से बड़ा है।
  • +1

    यदि आप शीर्ष डाउन मेमोरी आवंटन के साथ दौड़ते हैं तो आप स्थिति 3 की गारंटी दे सकते हैं जो –

    +0

    विकसित करते समय बहुत उपयोगी है आपकी पोस्ट लाइफ सेवर जॉन है। काश मैं इसमें अधिक ध्यान आकर्षित करने के लिए कुछ कर सकता था। मैंने एक घटक के साथ रॉक तल मारा था जो गलत तरीके से व्यवहार कर रहा था और आपकी अंतर्दृष्टि ने मुझे सही रास्ते पर रखा! आपने मेरा दिन बना दिया। नहीं, मेरा सप्ताह। शायद मेरा पूरा महीना कम से कम कहने के लिए। एक बार फिर धन्यवाद! पीएस .: यहां एक उदाहरण है कि int बनाम IntPtr के साथ चीजें दक्षिण में कैसे जा सकती हैं: http://stackoverflow.com/questions/15548016/global-keyboard-hook/36188346#36188346 – xDisruptor

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