2012-03-14 31 views
5

एमएसडीएन ने कहा, CDialog.DoModal() फ़ंक्शन के लिए, वापसी मान -1 है यदि फ़ंक्शन संवाद बॉक्स नहीं बना सका। यह नहीं कहता कि यह किस मामले में संवाद बॉक्स बनाने में विफल हो सकता है।जब CDialog.DoModal() फ़ंक्शन संवाद बॉक्स बनाने में विफल रहता है?

एमएफसी स्रोत कोड में एक त्वरित जांच से पता चलता है कि क्या (एलपीसीडीएलजीटीईएमएलईटी) लॉक रिसोर्स (एचडीअलॉग टेम्पलेट) न्यूल देता है, तो डोमोडाल फ़ंक्शन -1 लौटा सकता है।

चूंकि मेरी समस्या को हमारे तनाव परीक्षण में स्थिर रूप से पुन: उत्पन्न नहीं किया जा सकता है, इसलिए मैं रूट कारण खोजने के लिए प्रोग्राम को डीबग नहीं कर सकता। क्या यहां कोई भी इसी तरह की समस्या से मिलता है?

+3

आप एमएफसी का उपयोग करने के लिए _had_, है ना? – ApprenticeHacker

+1

GetLastError क्या कहता है? –

+0

@IntermediateHacker, आइए इसे "एपीआई बेकार, इसका उपयोग क्यों करें" बहस में न करें, हम पूरे दिन यहां होंगे। –

उत्तर

4

DoModal()CreateDialogIndirect() एपीआई फ़ंक्शन पर निर्भर करता है। अपने चचेरे भाई DialogBox() राज्यों के लिए प्रलेखन कि समारोह निम्न परिस्थितियों में असफल हो सकता है:

  • गलत पैरामीटर मान,
  • प्रणाली कक्षा एक अलग मॉड्यूल के द्वारा पंजीकृत किया गया,
  • WH_CBT हुक स्थापित किया गया है और विफलता कोड देता है,
  • संवाद टेम्पलेट में नियंत्रणों में से कोई एक पंजीकृत नहीं है, या इसकी विंडो प्रक्रिया WM_CREATE या WM_NCCREATE पर विफल हो जाती है।

मैं व्यक्तिगत रूप से कभी नहीं पहले तीन कारणों का सामना करना पड़ा है, लेकिन क्योंकि मेरे संवाद बॉक्स एक एक्टिव एक्स नियंत्रण उस मशीन पर पंजीकृत नहीं किया था मैं चौथे द्वारा एक बार काट लिया था। शायद आप एक ही समस्या का सामना कर रहे हैं।

+0

एमएफसी 'डायलॉगबॉक्स' का उपयोग नहीं करता है, यह इसे अन्य कॉल के साथ अनुकरण करता है। हालांकि इस उत्तर में कुछ जानकारी अभी भी उपयोगी है। –

+0

@ मार्क, आप बिल्कुल सही हैं, यह मोडल डायलॉग के लिए 'CreateDialogIndirect() 'का उपयोग करता है, और मोडल स्टेटस को ही लागू करता है। मुझे आश्चर्य है क्यों, लेकिन शायद एक अच्छा कारण है। आपके स्पष्टीकरण के लिए धन्यवाद :) –

+1

मेरे पास लोकेल बदलने के बाद DoModal कॉल विफल रहा था: नया संसाधन मूल संसाधनों के कुछ आईडी को याद करता था। मैं इस तरह की समस्या में दूसरों को इशारा देने की उम्मीद करता हूं। – Zac

0

मुझे पता चला कि मूल कारण थका हुआ जीडीआई वस्तुओं से आता है। हमारे सॉफ्टवेयर हैंडल लीक मौजूद है। रजिस्ट्री में जीडीआई वस्तुओं की अधिकतम संख्या सेट की जा सकती है। हमारे विंडोज एक्सपी में मूल्य 16000 है। मैंने कई यूआई नियंत्रण बनाने के लिए एक कार्यक्रम लिखा और उन्हें मुक्त नहीं किया। इस तरह से मैं जीडीआई संभाल थकाऊ स्थिति अनुकरण कर सकते हैं। नतीजतन, एक ही समस्या फिर से पुन: उत्पन्न होती है।

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Windows \ GDIProcessHandleQuota

रेफरी: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724291%28v=vs.85%29.aspx

तो यह अंतिम निष्कर्ष यह है कि जब GDI वस्तुओं समाप्त कर रहे हैं, इस तरह के CDialog के रूप में कुछ यूआई नियंत्रण, बनाने में असफल रहेगा?

+0

जटिल जीयूआई (सीएडी, ईडीए) के साथ अनुप्रयोगों को चलाने/डीबग करने पर Win32 पर थकावट संभालती है। Win64 पर हम हैंडल मुद्दे से बाहर की उम्मीद नहीं की थी। – BlackBada

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