Stapelfehler



  • Hi,

    wenn ich folgenden Code schreibe, kriege ich ein abstürzendes Programm samt Meldung "Stapelfehler" (der Debugger lässt sich da irgendwie nicht aktivieren).

    void Klasse::Funktion(int nItemID)
    {
       HMENU hHandle = this->GetSubMenuHandle(nItemID);
    
       MENUITEMINFO stMenuItem;
    
       stMenuItem.cbSize = sizeof();
       stMenuItem.fMask = MIIM_TYPE;
       stMenuItem.fType = MFS_OWNERDRAW;
    
       SetMenuItemInfo(hHandle, ...., &stMenuItem);
    
       return;
    }
    

    Wo es abstürzt ist eigentliche auch klar, und zwar bei dem Aufruf von SetMenuItemInfo(), das Handle des Menüs muss irgendwas damit zu tun haben.

    Dummerweise ist das Handle nicht NULL, zudem hat es den Wert, den es haben sollte, denn andere Funktionsaufrufe mit diesem Handle, wie beispielsweise GetMenuItemInfo(), CheckMenuItem() usw. schlagen nicht fehl.

    Was kann denn nun der Grund für einen Stapelfehler sein? Der tritt übrigens nur bei WinME bei diesem Programm auf, unter Win2000 gibt's keinen Stapelfehler.

    Vielen dank für Hilfe. 🙂



  • JensE schrieb:

    stMenuItem.cbSize = sizeof();

    Fehlt da nicht was?



  • Sorry, hab MENUITEMINFO vergessen.

    Aber das war noch nicht das Problem.



  • Was ist daran Standard C++ und was sucht ein return in einer void funktion ?

    Devil



  • Aber das Return gibt doch nix zurück.....



  • Was ist daran Standard C++ und was sucht ein return in einer void funktion ?

    1. Was genau meinst du mit Standard-C++? (die Punkte bei SetMenuItemInfo() musst du dir übrigens wegdenken).
    2. Das return setz ich auch in void-Funktionen (zulässig!) aus Angewohnheit (weil es sein könnte, dass die Funktion später mal einen Rückgabewert spendiert bekommt) -> bitte nicht steinigen.


  • void Klasse::Funktion(int nItemID)
    {
       return;
    }
    

    Soviel ist Standard C++, der Rest sind alles Bibliotheks funktionen,
    die der Standard nicht kennnt. -> falsches Forum.

    bist du dir auch sicher, das der Fehler in der Funktion verursacht wird ?

    Devil



  • Ich bin mir da so ziemlich sicher, denn wenn ich SetMenuItemInfo() nicht aufrufe, oder sogar, wenn ich statt des Handles NULL übergeb, kommt es nicht zu einem Stapelfehler.

    In welches Forum gehört sowas denn eigentlich?



  • In welches Forum gehört sowas denn eigentlich?

    WinAPI.



  • 1.) Inwiefern lässt sich der Debugger nicht starten 😕
    2.) Was hast du bei SetMenuItemInfo für die anderen Parameter angegeben?



    1. In der Fehlermeldung fehlt der Button "Debug", der beispielsweise bei Speicherschutzverletzungen mit delete vorhanden ist.

    2. Hab die genauen Parameter der Funktion jetzt nicht parat.

    Ich glaube so:

    SetMenuItemInfo(hHandle, nItemID, true, &stItem);

    Wenn du darauf hinauswillst, dass ich den Parameter 3 (ob nun by command oder by position) falsch gesetzt hab, so dass die ID als Position betrachtet wird: Ich habe das auf jeden Fall richtig gemacht, da bin ich mir sicher.



  • Die MENUITEMINFO Struktur ist ja nicht gerade vollständig ausgefüllt. 😉

    Solltest sie wenigstens nullen.



  • JensE schrieb:

    In der Fehlermeldung fehlt der Button "Debug", der beispielsweise bei Speicherschutzverletzungen mit delete vorhanden ist.

    1.) Kompilierst du als Debug-Version, oder hast du das schon auf Release?
    2.) Warum startest du es nicht gleich aus VC++ über den Debugger (F5) - und dann schrittweise durchgehen 😉



    1. Ja ist die Debug-Version.

    2. Könnt ich mal machen. Aber dürfte ja eh nicht viel bringen, denn wie gesagt, auf Win2000 funzt es, auf WinME nicht, und eindeutig liegt das Problem beim ersten Parameter von SetMenuItemInfo(), nämlich dem Handle eines Untermenüs.



  • Hast du die Struktur jetzt wenigstens mal mit 0 (ZeryMemory) initialisert oder vollständig ausgefüllt?



  • Kann ich im Moment leider nicht (bin grad an der FH), aber ich versuchs heute nachmittag mal und sag nochmal bescheid! 🙂

    Was kann das Nullen der Struktur denn eigentlich ändern?



  • Wenn du nicht allen Membern einen Wert zuweist und du die Struktur vorher nicht initialisiert hast enthalten diese beliebige Werte.



  • Da stimme ich dir zu. Machst du das grundsätzlich vor Funktionsaufrufen?

    Ich habe das eigentlich selten gemacht und habe noch nicht mit solchen Fehlern zu tun gehabt. 😉



  • Globale Variablen werden afaik automatisch initialisiert, aber ansonsten solltest du, wenn du nicht alle Member besetzt, vorher ZeroMemory aufrufen 😉



  • Danke für die Auskunft! 👍

    Werd ich in Zukunft so machen.

    Sollte das bei meinem Stapelfehler auch nicht helfen, sag ich nochmal bescheid. 🙂


Anmelden zum Antworten