2009-09-28 13 views
7

इस समस्या का परीक्षण करने के लिए मैंने एक न्यूनतम विंडोज एप्लिकेशन लिखा है। अगर मैं WM_PAINT हैंडलर में एक्सेस उल्लंघन को मजबूर करता हूं तो यह अपवाद डीबगर को कभी नहीं मिलता है। अगर डीबगर के बिना शुरू किया गया तो एक्सेस उल्लंघन भी दिखाई नहीं देता है। आमतौर पर आपको विंडोज त्रुटि रिपोर्टिंग संवाद प्राप्त करना चाहिए।WM_PAINT में पहुंच उल्लंघन

थोड़ा गहरा खोना ऐसा लगता है कि user32.dll में कुछ आने वाले अपवादों को पकड़ता है। क्या यह सामान्य व्यवहार है? क्या मैं इसे किसी भी तरह नियंत्रित कर सकता हूं? सभी अपवादों को सुरक्षा जोखिम को पकड़ नहीं रहा है? कम से कम यह नरक के रूप में परेशान है।

यह Vista 64 पर 32- और 64-बिट अनुप्रयोग के साथ है। XP पर अपवाद को अपेक्षा के अनुसार संभाला जा रहा है। अन्य विंडोज संदेशों में एक ही समस्या है। शायद उन सभी?

WM_PAINT हैंडलर:

case WM_PAINT: 
    hdc = BeginPaint(hWnd, &ps); 
    *(int*)0 = 0; 
    EndPaint(hWnd, &ps); 
    break; 

उत्तर

5

एक कामकाज के रूप में मैं अपनी खिड़की प्रक्रिया में सभी पंजीकृत अपवाद हैंडलर को हटा देता हूं। काफी बदसूरत

 
LRESULT CALLBACK window_proc( 
    HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    // get thread information block 
    NT_TIB* tib; 
    __asm { 
     mov EAX, FS:[18h] 
     mov [tib], EAX 
    } 
    // old exception handler list 
    _EXCEPTION_REGISTRATION_RECORD* old_exception_handler = tib->ExceptionList; 
    // remove all exception handler with exception of the default handler 
    while(tib->ExceptionList->Next != (_EXCEPTION_REGISTRATION_RECORD*)-1) { 
     tib->ExceptionList = tib->ExceptionList->Next; 
    } 

    LRESULT result = DefWindowProc(hwnd, uMsg, wParam, lParam); 

    // restore old exception handler 
    tib->ExceptionList = old_exception_handler; 

    return result; 
} 
0

अपवाद WinXP में और Vista में फेंक दिया जाएगा। मैंने अभी विस्टा में डीबग और रिलीज कॉन्फ़िगरेशन में इसका परीक्षण किया है। क्या आपके पास नई Win32 एप्लिकेशन प्रोजेक्ट में एक ही समस्या है?

3

डिस्पैच मैसेज में अब एक एसईएच पकड़ने वाला ब्लॉक शामिल है जो विंडो प्रोसेस द्वारा उत्पन्न अपवाद को रोकता है।

आप अभी भी डिबगर में इन अपवादों को पकड़ सकते हैं - आपके विजुअल स्टूडियो संस्करण के आधार पर आपको डीबग-> अपवाद संवाद खोलने की आवश्यकता है और सभी Win32 अपवादों के लिए "अपवाद फेंक दिया गया है" कॉलम पर क्लिक करें, या कम से कम अपवाद 0xc0000005

+0

मुझे पता है लेकिन डीबगर का उपयोग करते हुए यह केवल एक समाधान है। और विंडोज़ संदेशों को संभालने के दौरान फेंकने वाले सभी अन्य अपवादों के साथ क्या है? क्या आपके पास इस बदलाव के लिए कोई आधिकारिक (या अनौपचारिक) दस्तावेज या तर्क है? –

0

मैंने देखा है कि, जब आपके पास एरो सक्षम है (जो विस्टा में डिफ़ॉल्ट रूप से है), विंडोज़ का आकार बदलने से कई सारे पेज दोष पैदा होते हैं। ये सामान्य वर्चुअल मेमोरी-ज़रूरत-से-प्लेज-फॉल्ट में नहीं हैं, या तो। मुझे संदेह है (हालांकि यह सिर्फ एक सिद्धांत है), कि एरो ग्राफिक्स आउटपुट को स्मृति के संरक्षित खंड में रीडायरेक्ट करता है, और यह जानने के लिए दोषों को पकड़ता है कि दृश्य सतह के किनारे डेस्कटॉप पर पुनः संयोजित किए जाने की आवश्यकता है। शायद वह अन्य पहुंच उल्लंघन भी खा रहा है।

+0

Vista वीडियो मेमोरी के साथ शुरुआत वर्चुअलाइज्ड है। यह अनुप्रयोगों में किसी भी अपवाद से संबंधित नहीं होना चाहिए। कम से कम एरो सक्षम या विंडोज संदेशों में अपवाद हैंडलिंग के साथ कुछ भी नहीं बदलता है। –

+0

आप सही हैं। डेस्कटॉप कंपोजिटिंग सक्षम है या नहीं, इस पर ध्यान दिए बिना अपवाद हटा दिया गया है। –

0

एक्सपी से शुरू, वेक्टर अपवाद हैंडलिंग कार्यक्षमता का उपयोग किया जा सकता है। यह अन्य सभी प्रकार के अपवादों पर प्राथमिकता है। मेरे उदाहरण में, यह WM_PAINT संदेश में एक्सेस उल्लंघन का सही ढंग से पकड़ा गया। दुर्भाग्यवश, यह अन्य सभी प्रकार के अपवाद भी पकड़ता है, जिसे मुझे अपवाद कोड की जांच करके शायद हल करना चाहिए।

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