Stapelfehler
-
Was ist daran Standard C++ und was sucht ein return in einer void funktion ?
- Was genau meinst du mit Standard-C++? (die Punkte bei SetMenuItemInfo() musst du dir übrigens wegdenken).
- 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?
-
-
In der Fehlermeldung fehlt der Button "Debug", der beispielsweise bei Speicherschutzverletzungen mit delete vorhanden ist.
-
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
-
-
Ja ist die Debug-Version.
-
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.

-
Hi,
wenn ich die Struktur vor dem Aufruf nulle, klappt es auch nicht, hier mal der gesamte Code:
bool CMenu::MeasureItem(LPMEASUREITEMSTRUCT pstMeasureItem) { MENUITEMINFO stSubMenuPt; ZeroMemory(&stSubMenuPt, sizeof(MENUITEMINFO)); int nSubMenuItem = LOWORD(pstMeasureItem->itemData); int nType = HIWORD(pstMeasureItem->itemData); SUBMENU *pstSubMenu = this->GetSubMenuStruct(pstMeasureItem->itemID, this- >pstMenu); if (pstSubMenu == NULL || pstSubMenu->hHandle == NULL) return false; if (nType == MT_LINE) { pstMeasureItem->itemHeight = g_nMenuHeight - C_nSeparator; stSubMenuPt.cbSize = sizeof(MENUITEMINFO); stSubMenuPt.fMask = MIIM_STATE; stSubMenuPt.fState = MFS_DISABLED | MFS_UNHILITE; // Hier kommt der Stapelfehler! SetMenuItemInfo(pstSubMenu->hHandle, pstMeasureItem->itemID, false, &stSubMenuPt); } else pstMeasureItem->itemHeight = g_nMenuHeight; if (nSubMenuItem == 0 || nSubMenuItem == pstSubMenu->nCount - 1) pstMeasureItem->itemHeight += 1; pstMeasureItem->itemWidth = pstSubMenu->nWidth; return true; }Was ist daran nur falsch? (Wie gesagt, auf Win2000 funktioniert es, auf WinME aber nicht).
-
Hast du evtl. per define irgendwo gesagt, dass du für W2K compilieren willst?!
-
Nein hab ich nicht!
(Hab nur ein WIN32_LEAN_AND_MEAN drin, dürfte aber nicht schlimm sein?!).