[Win32/C] MessageBox sluit zichzelf direct na openen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi allemaal,

Ik ben bezig met een project waarvoor ik de volgende functie heb gemaakt, die een foutmelding moet weergeven:

code:
1
2
3
4
5
6
7
8
9
#include <windows.h>

void throw_error(const char* error)
{
    int result;

    result = MessageBox(NULL, error,
                        NULL, MB_OK | MB_ICONEXCLAMATION | MB_SETFOREGROUND);
}


In de voorbeelden die ik heb weten te vinden wordt dit op dezelfde manier gedaan, maar toch werkt dit stukje code niet naar behoren. Op mijn Windows XP testcomputer verdwijnt de MessageBox namelijk direct na het openen weer. Ik hoor wel het "ping" geluidje van Windows, maar krijg de MessageBox niet te zien.

Ik ben al uren op zoek naar mogelijke oplossingen, maar eigenlijk zijn alle voorbeelden die ik tegenkom ongeveer hetzelfde als dit. Ik heb wel kleine variaties gezien, zoals het gebruik van de TEXT() macro om "error" heen, maar dit maakt allemaal geen verschil. Ik heb ook nog geprobeerd om als eerste parameter in plaats van NULL de handler van het hoofdwindow mee te geven, maakt ook niets uit.

Voor zover ik uit de debugger kan opmaken geeft MessageBox 0 terug, en geeft GetLastError de code 128. Dat schijnt te staan voor "ERROR_WAIT_NO_CHILDREN". Het lijkt mij dat de MessageBox crasht, en de error volgt omdat er geen MessageBox meer is om op te wachten, maar ik kom er niet achter waarom de MessageBox dan crasht. Ik denk dat Windows mogelijk iets anders wil dan mijn char*, maar ik kom er niet achter wat ik dan wel moet gebruiken. Als de char* inderdaad het probleem is, dan zou ik het liefst een conversie uitvoeren binnen throw_error(), zodat ik daarbuiten een char* kan blijven gebruiken. Deze code moet namelijk later nog worden geport, en dan wil ik liever niet overal Windows types hebben rondslingeren.

Overigens: op een andere Windows computer (Windows 7) lijkt de MessageBox wel te werken. :?

Ik heb veel ervaring met C in Linux, maar programmeer eigenlijk heel weinig in Windows. Misschien maak ik dus een enorme beginnersfout. Ik hoop dat een van de meer ervaren Windows-programmeurs hier me verder kan helpen.

Ik schrijf dit programma met Dev-C++ onder Windows XP SP3.

Alvast bedankt!

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 10-09 21:12

Matis

Rubber Rocket

Wat als je een breakpoint zet op die regel?
Wat als je error cast naar een (LPCWSTR)L ?
Misschien komt het omdat er niets wordt gedaan met de returnvalue / result van de MessageBox.

Return anders eens result.

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • Bozozo
  • Registratie: Januari 2005
  • Laatst online: 20-02 16:10

Bozozo

Your ad here?

Euh... je gebruikt de MessageBox Class gewoon verkeerd?

TabCinema : NiftySplit


Acties:
  • 0 Henk 'm!

  • CoolGamer
  • Registratie: Mei 2005
  • Laatst online: 06-09 16:59

CoolGamer

What is it? Dragons?

Dat managed C++, de TS maakt gebruik van Native C++.

¸.·´¯`·.¸.·´¯`·.¸><(((º>¸.·´¯`·.¸><(((º>¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸<º)))><¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸


Acties:
  • 0 Henk 'm!

  • Mijzelf
  • Registratie: September 2004
  • Niet online
Compileer je wel een ANSI project? (itt Unicode). Anders is inderdaad char * niet goed, dat zou dan wchar_t * moeten zijn. Hoewel je dan wel een compiler error zou verwachten. Je kunt ANSI forceren door ipv MessageBox MessageBoxA te gebruiken. En uiteraard moet de string nul-terminated zijn.

Waar komt de error vandaan? Voor zover ik weet mag je vanuit een multimedia thread geen messageboxen starten.

Acties:
  • 0 Henk 'm!

  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

ERROR_WAIT_NO_CHILDREN krijg je als je probeert te wachten op onbestaande processen volgens MSDN.
Ik gok dat je proces dood gaat op het moment dat jij je MessageBox doet.

Doe je iets met threads (als in, roep jij MessageBox aan vanuit je main thread?)

-niks-


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Matis schreef op maandag 02 augustus 2010 @ 13:11:
Wat als je een breakpoint zet op die regel?
Wat als je error cast naar een (LPCWSTR)L ?
Misschien komt het omdat er niets wordt gedaan met de returnvalue / result van de MessageBox.

Return anders eens result.
Ik heb een breakpoint gezet op die regel. Er opent dan een MessageBox, die vast lijkt te lopen o.i.d. Als je dan een stap verder gaat sluit de MessageBox weer. Casten naar (LPCWSTR) heb ik ook al geprobeerd, maar zal ik voor de zekerheid nog eens testen. Ook zal ik testen of het werkt als ik result return, ik zal het resultaat laten weten.
TheCoolGamer schreef op maandag 02 augustus 2010 @ 13:23:
[...]

Dat managed C++, de TS maakt gebruik van Native C++.
Ik gebruik geen .NET. Ik doel op deze MessageBox functie: http://msdn.microsoft.com/en-us/library/ms645505(VS.85).aspx. Ik gebruik C, geen C++. "Classes" bestaan voor mij dus niet.
Mijzelf schreef op maandag 02 augustus 2010 @ 13:52:
Compileer je wel een ANSI project? (itt Unicode). Anders is inderdaad char * niet goed, dat zou dan wchar_t * moeten zijn. Hoewel je dan wel een compiler error zou verwachten. Je kunt ANSI forceren door ipv MessageBox MessageBoxA te gebruiken. En uiteraard moet de string nul-terminated zijn.

Waar komt de error vandaan? Voor zover ik weet mag je vanuit een multimedia thread geen messageboxen starten.
Ik zal even kijken in de IDE of hij ANSI compileert. Overigens heb ik wel al geprobeerd om MessageBoxA() te forceren, maar dat leverde niets op. :( De string is NULL-terminated, dus dat is het probleem in ieder geval niet. Ik ben niet zo thuis in de Windows-terminologie, wat is een multimedia thread?

De functie wordt in ieder geval (bijvoorbeeld) als volgt gebruikt:

code:
1
throw_error("Fout!");
MLM schreef op maandag 02 augustus 2010 @ 14:46:
ERROR_WAIT_NO_CHILDREN krijg je als je probeert te wachten op onbestaande processen volgens MSDN.
Ik gok dat je proces dood gaat op het moment dat jij je MessageBox doet.

Doe je iets met threads (als in, roep jij MessageBox aan vanuit je main thread?)
Ik heb enkel één main window, en aangezien ik zelf geen nieuwe threads spawn heb ik volgens mij inderdaad alleen maar één main thread (tenzij Windows zelf meerdere threads maakt). MessageBox wordt dus inderdaad vanuit de main thread aangeroepen. Ik vermoed inderdaad ook dat de MessageBox dood gaat op het moment dat ik hem aanroep, of bedoel jij iets anders? Het is in ieder geval niet zo dat het hele programma crasht bij de aanroep van de MessageBox, enkel de MessageBox zelf lijkt meteen "dood te gaan".

Bedankt voor alle antwoorden, ik zal eens kijken of de suggesties iets opleveren (moet ik even op mijn testmachine proberen). :) Ik zal laten weten hoe het gaat.

Edit: Helaas, geen van de oplossingen lijkt te werken. :'( Overigens: als ik een wchar_t* mee geef aan de MessageBox() macro, dan klaagt de compiler dat MessageBoxA() dat niet verwacht. Het lijkt er dus op dat MessageBox() in mijn geval inderdaad resolved naar MessageBoxA(), en dat het project dus ANSI gecompileerd wordt.

[ Voor 4% gewijzigd door Verwijderd op 02-08-2010 17:06 ]


Acties:
  • 0 Henk 'm!

  • Bozozo
  • Registratie: Januari 2005
  • Laatst online: 20-02 16:10

Bozozo

Your ad here?

Vertoont het voorbeeld van MSDN dezelfde problemen?

TabCinema : NiftySplit


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat deed hij inderdaad, en toen begon ik toch wel heel sterk te vermoeden dat er gewoon iets mis was in de IDE. Ik had alle logische opties al geprobeerd, maar ben ze nu allemaal even langs gelopen. Er was een of andere rare checkbox die "support windows xp themes" heette, en die stond aangevinkt. Ik zou nooit hebben geraden dat het er iets mee te maken had, maar toen ik die uitvinkte en opnieuw compileerde was het probleem opgelost. :F

Bedankt dus allemaal voor de hulp, en sorry voor de enorme anticlimax. 8)7
Pagina: 1