c ++ - Når funktionen CDialog.DoModal () ikke oprettes dialogboks?

Indlæg af Hanne Mølgaard Plasc

Problem



MSDN sagde, for funktionen CDialog.DoModal () er returværdien -1, hvis funktionen ikke kunne skabe dialogboksen. Det siger ikke, i hvilket tilfælde det kunne undlade at oprette dialogboksen.


En hurtig undersøgelse af MFC-kildekoden viser, om (LPCDLGTEMPLATE) LockResource (hDialogTemplate) returnerer NULL, DoModal-funktionen kunne returnere -1.


Da mit problem ikke kan reproduceres stabilt i vores stresstest, kan jeg ikke fejle programmet for at finde årsagen. Fandt nogen her et lignende problem?

Bedste reference


DoModal() er afhængig af CreateDialogIndirect () API funktionen. Dokumentationen for sin fætter DialogBox () angiver, at funktionen kan mislykkes under følgende omstændigheder: [5] [6]



  

      
  • en ugyldig parameterværdi

  •   
  • Systemklassen blev registreret af et andet modul,

  •   
  • Krogen WH\_CBT er installeret og returnerer en fejlkode

  •   
  • En af kontrollerne i dialogskabelonen er ikke registreret, eller dens vindueprocedure svigtes på WM\_CREATE eller WM\_NCCREATE.

  •   



Jeg har aldrig stødt på de tre første grunde, men jeg blev bidt en gang for fjerde fordi min dialogboks indeholdt en ActiveX-kontrol, der ikke var registreret på maskinen. Måske oplever du det samme problem.

Andre referencer 1


Jeg fandt årsagen kommer fra de udmattede GDI objekter. Vores software findes håndtag lækager. Det maksimale antal GDI objekter kan indstilles i registreringsdatabasen. Værdien er 16000 i vores Windows XP. Jeg skrev et program til at oprette mange brugergrænseflader og ikke frigøre dem. På denne måde kan jeg simulere GDI-håndterende udmattende situation. Som et resultat er det samme problem gengivet igen.


HKEY\_LOCAL\_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Windows \ GDIProcessHandleQuota


Ref: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724291\%28v=vs.85\%29.aspx[7]


Så er det den endelige konklusion, at når GDI-objekter er opbrugt, ville nogle brugergrænseflader som CDialog ikke kunne oprette?