2012-03-14 15 views
5

MSDN, CDialog.DoModal() işlevi için, işlev iletişim kutusu oluşturulamadıysa, dönüş değeri-1'dir. Bu durumda iletişim kutusunu oluşturulamadığı söylenemez.CDialog.DoModal() işlevi, iletişim kutusu oluşturulamadığında ne zaman başarısız olur?

MFC kaynak koduyla ilgili hızlı bir araştırma, (LPCDLGTEMPLATE) LockResource (hDialogTemplate) NULL değerini döndürürse, DoModal işlevinin -1 döndürüp döndüremeyeceğini gösterir.

benim sorunum Stres testinde kararlı bir şekilde üretilemeyen beri, kök nedenini bulmak için programı debug olamaz. Burada benzer bir sorun var mı?

+3

MFC'yi kullanmak için _had_, değil mi? – ApprenticeHacker

+1

GetLastError ne diyor? –

+0

@IntermediateHacker, bunu bir "API'nin berbat, neden kullanalım" tartışmasına çevirmeyelim, tüm gün burada olacağız. –

cevap

4

DoModal()CreateDialogIndirect() API fonksiyonu dayanır. fonksiyonu aşağıdaki şartlar altında başarısız olabilir kuzeni DialogBox() ilişkin belgelere: WH_CBT kanca yüklü

  • sistem sınıfı farklı bir modül ile tescil edilmiştir

    • geçersiz parametre değeri, ve iletişim şablonunda bir hata kodu, kontrollerin
    • birini döndürür kayıtlı değil, ya da pencere yordamı WM_CREATE veya WM_NCCREATE üzerinde başarısız olur.

  • Ben şahsen ilk üç nedeni karşılaştı asla ama benim iletişim kutusu makinede kayıtlı değil bir ActiveX denetimi içerdiği çünkü dördüncü bir kez ısırıldı. Belki de aynı sorunu yaşıyorsun.

    +0

    MFC 'DialogBox''u kullanmaz, diğer aramalarla simüle eder. Bu cevaptaki bazı bilgiler hala yararlıdır. –

    +0

    @Mark, kesinlikle haklısınız, modal diyaloglar için bile CreateDialogIndirect() işlevini kullanıyor ve modal durumun kendisini uygular. Nedenini merak ediyorum ama muhtemelen iyi bir sebep var. Açıklama için teşekkür ederiz :) –

    +1

    Yerel değiştirdikten sonra DoModal çağrısı başarısız oldu: Yeni kaynak, orijinal kaynağın bazı kimliklerini kaçırdı. Bunu benzer problemde başkalarına ipucu vermeyi umuyoruz. – Zac

    0

    Kök nedeni, bitkin GDI nesnelerinden geliyor. Yazılımımız sızıntıları ele alıyor. GDI nesnelerinin maksimum sayısı kayıt defterinde ayarlanabilir. Windows XP'de değer 16000'dir. Çok sayıda UI kontrolü oluşturmak ve onları serbest bırakmak için bir program yazdım. Bu şekilde GDI kolu yorucu durumunu simüle edebilirim. Sonuç olarak, aynı sorun yeniden üretilir. \

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

    Ref: Yani nihai sonuca http://msdn.microsoft.com/en-us/library/windows/desktop/ms724291%28v=vs.85%29.aspx

    olduğunu GDI nesneleri tükendiği zaman, böyle CDialog gibi bazı UI kontrolleri, yaratılamaz mıydı?

    +0

    Yordamları, karmaşık GUI (CAD, EDA) ile uygulama/hata ayıklama yaparken Win32'de iyi bilinen bir sorundur. Win64'te, Out of Handles sorununu beklemiyoruz. – BlackBada

    İlgili konular