2012-02-09 21 views
7

काम करता है मुझे एक WPF अनुप्रयोग में कस्टम कर्सर के साथ समस्या हो रही है। मैं Cursor वस्तुओं को बनाने के लिए निम्न कोड का उपयोग करें:SafeFileHandle.Close एक अपवाद फेंकता है लेकिन हैंडल मान्य है और

System.Runtime.InteropServices.SEHException was unhandled 
    Message=External component has thrown an exception. 
    Source=mscorlib 
    ErrorCode=-2147467259 
    StackTrace: 
     at Microsoft.Win32.Win32Native.CloseHandle(IntPtr handle) 
     at Microsoft.Win32.SafeHandles.SafeFileHandle.ReleaseHandle() 
     at System.Runtime.InteropServices.SafeHandle.InternalDispose() 
     at System.Runtime.InteropServices.SafeHandle.Dispose(Boolean disposing) 
     at System.Runtime.InteropServices.SafeHandle.Dispose() 
     at System.Windows.Input.Cursor.Finalize() 
    InnerException: 

मैं रखकर कुछ आगे की जांच पड़ताल किया:

[DllImport("user32.dll")] 
private static extern IntPtr CreateIconIndirect(ref IconInfo icon); 

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
private static extern bool GetIconInfo(IntPtr hIcon, ref IconInfo pIconInfo); 

private static Cursor CreateCursor(string cursorName, System.Drawing.Bitmap bmp, 
    int xHotspot, int yHotspot, out SafeFileHandle handle) 
{ 
    IconInfo tmp = new IconInfo(); 
    GetIconInfo(bmp.GetHicon(), ref tmp); 
    tmp.xHotspot = xHotspot; 
    tmp.yHotspot = yHotspot; 
    tmp.fIcon = false; 

    IntPtr ptr = CreateIconIndirect(ref tmp); 
    handle = new SafeFileHandle(ptr, true); 

    if (handle.IsClosed) 
    { 
     return null; 
    } 

    Cursor cur = CursorInteropHelper.Create(handle); 

    return cur; 
} 

जब मैं अपने आवेदन को बंद करने और जीसी कचरा उठा शुरू होता है, यह एक अपवाद फेंकता if (handle.IsClosed) पर ब्रेकपॉइंट और handle.Close() पर कॉल करने के लिए तत्काल विंडो का उपयोग करना। SafeFileHandle के कुछ करीबी बस ठीक है, दूसरों ने हैंडल बनने के तुरंत बाद — को एक ही अपवाद फेंक दिया।

और चीजों को मजेदार बनाने के लिए, हैंडल स्वयं ठीक काम करते हैं। IsInvalid गलत है, IsClosed गलत है, और कर्सर प्रकट होते हैं। यह सिर्फ कुछ हैंडल कभी बंद नहीं किया जा सकता है।

जैसा कि मैं मैन्युअल रूप से हैंडल को बंद करने का इरादा नहीं रखता हूं, और एप्लिकेशन बंद होने पर Cursor ऑब्जेक्ट्स को अंतिम रूप देने के दौरान ही उन्हें बंद कर दिया जाएगा, मैं उन्हें केवल अनदेखा कर सकता हूं। मैंने वीएस -2010 के बाहर रिलीज बिल्डिंग की कोशिश नहीं की है और मुझे नहीं पता कि इससे क्रैश संवाद दिखाई देगा या नहीं। लेकिन अगर मैं उन्हें अनदेखा कर सकता हूं, तो यह अभी भी गन्दा है।

तो मूल रूप से मैं यहां क्या गलत हो रहा है, इस पर किसी भी जानकारी की तलाश कर रहा हूं, जहां इसे देखने और डीबग करने के लिए देखना है ... सबकुछ मूल कोड या जीसी में लगता है और मैं इसे किसी भी डीबग नहीं कर सकता ।

उत्तर

15

आप लपेटकर रहे HICON एक SafeFileHandle जो, जारी करने की, कॉल की जरूरत DestroyIcon के बजाय HICON पर CloseHandle में CreateIconIndirect से लौट आए। SafeFileHandle में HICON लपेट नहीं करते हैं लेकिन एक खुद के बजाय, विशेष SafeHandle:

class SafeIconHandle : SafeHandleZeroOrMinusOneIsInvalid 
{ 
    [DllImport("user32.dll", SetLastError = true)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    internal static extern bool DestroyIcon(
     [In] IntPtr hIcon); 

    private SafeIconHandle() 
     : base(true) 
    { 
    } 

    public SafeIconHandle(IntPtr hIcon) 
     : base(true) 
    { 
     this.SetHandle(hIcon); 
    } 

    protected override bool ReleaseHandle() 
    { 
     return DestroyIcon(this.handle); 
    } 
} 
+0

धन्यवाद! मैं डब्ल्यूपीएफ के लिए बिल्कुल नया हूं, कभी WinForms नहीं किया, और यह मेरा पहला समय देशी कोड से निपटने के लिए है। और आपकी टिप्पणी हटाने और इसे उत्तर देने के लिए धन्यवाद। :) –

+1

@RyanP आपका स्वागत है। ऐसी चीजें याद करने में आसान होती हैं, खासकर यदि सबकुछ पहले दिखने पर काम करता है। – ordag

+0

उस समाधान के लिए धन्यवाद! – Kai

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

  • कोई संबंधित समस्या नहीं^_^