Menu Eintrag aus dem Nichts....
-
Hallo,
ich habe ein Programm in dem ich ein eigenes Menü habe (Debug | File | View | Help). So sollte es eigentlich aussehen (laut IDR_MAINFRAME). Allerdings ist das rechteste Dropdown menu nie sichtbar (also in diesem Fall "Debug" und anstatt dessen habe ich immer zusätzlich einen Punkt "Calibration" im Menü. Wenn ich das Programm laufen lasse und auf Calibration klicke, stürzt es sofort mit folgender Fehlermeldung (PopUp) ab:
*
Debug Assertion Failed!Program: ...\wieauchimmer.exe
File: afxwin1.inl
Line: 1046For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts.
(Press Retry to debug the application)
*Ich habe schon nach dem Begriff "Calibration" gesucht aber nichts dergleichen gefunden... hat jemand eine Ahnung wo das Problem liegen könnte?
Ich habe das Menü auch schon mal komplett gelöscht und manuell wieder neu erstellt... ohne Ergebnis.

Ich nutze übrigens Microsoft Visual C++ 5.0 als Umgebung.Besten Dank im Voraus,
lg
Phil
-
Diese Meldung wird von der Funktion assert() ausgelöst.
Und zwar wenn die Bedingung in der Klammer FALSE ist.
Deshalb muß Du dort nachsehen, warum die Bedingung FALSE ist (afxwin1.inl in Zeile 1046).assert() wird meistens als interne Überwachungspunkte eingebaut, meistens in der Entwicklungs- sowie in den Beta-Test-Phasen des Programms.
assert() wird i.d.R. nur dann im Programm eingebunden, wenn es in der Debug- und nicht in der Release-Ausführung compiliert wird.
Martin
-
Hi Martin,
tausend Dank schon mal für Deine Antwort!
Ich habe mal in der afxwin1.inl geschaut und in der Zeile 1046 folgendes gefunden:_AFXWIN_INLINE UINT CMenu::GetMenuItemCount() const { ASSERT(::IsMenu(m_hMenu)); return ::GetMenuItemCount(m_hMenu); }Also meinst Du wenn die Bedingung (sprich m_hMenu) TRUE ist, erscheint der Menü-Punkt (ich kenn die korrekte Bezeichnung leider nicht, sry
) "Calibration" nicht mehr?
Meine Frage ist halt... wo kommt der Eintrag her? Irendwo muss ja "Calibration" als Menü Eintrag geschrieben sein oder verstehe ich da etwas völlig falsch?Wie man sieht kenn ich mich in der ganzen Windows-API Geschichte noch nicht wirklich aus.. deshalb danke ich um so mehr für eure / Deine Hilfe!!
Besten Gruß,
Phil
-
Ein Problem ist, daß Du da nicht mit WinAPI arbeitest, sondern mit MFC. Also falsches Forum (oder falsches Programm?
)
-
Ei... mensch da blickt aber auch irgendwann auch kein Mensch mehr durch... sorry.
Ist MFC nicht auch API? Also API in C / C++ quasi? Hoffe die Frage ist jetzt nicht zuu dumm... lol
Und sollte ich den Thread dann verschieben (lassen)?
Grüße,
Phil
-
Jain. MFC ist die OOP-gekapselte API. Die eigentliche WinAPI läuft nicht objektorientiert, sondern prozedural (ist älter als C++).
Solche KonstrukteCMenu::GetMenuItemCount()findest Du in der WinAPI nicht, weil CMenu ein Objekt der MFC ist.
In den Objekten verstecken sich aber noch andere Funktionen, die nicht direkt offensichtlich sind. Daher reagiert ein Programm bei Fehlern manchmal anders, als ein WinAPI-ler es gewohnt ist.
Fazit: Besser im MFC-Forum nochmal fragen.
Hoffe die Frage ist jetzt nicht zuu dumm... lol

Dumm ist, wer nicht fragt.

-
Vielen Dank für die Erklärung und die Antwort ob ichs wirklich machen, oder lieber sein lassen soll!!

Dann werde ich meine Frage mal ins MFC-Forum copypasten...

Also dann,
MfC, mit freundlichen Grü... ach ne, das ging ja anders *lach*

Phil
-
Also, zunächst einmal: Dein Problem hat eigentlich gar nichts mit MFC zu tun.
phil_z schrieb:
_AFXWIN_INLINE UINT CMenu::GetMenuItemCount() const { ASSERT(::IsMenu(m_hMenu)); return ::GetMenuItemCount(m_hMenu); }ASSERT() ist in diesem Fall eine Überprüfung, ob der übergebene Parameter für die Funktion GetMenuItemCount(m_hMenu) überhaupt ein gültiges Menu-Handle (also HMENU) ist.
Und genau diese Überprüfung ist in Deinem Falle einfach fehlgeschlagen.
D.h. Du hast entweder ein falsches m_hMenu oder Du hattest schon ein richtiges m_hMenu-Wert ermittelt, welcher später aber irgendwie ungültig geworden ist.
Sowohl IsMenu() als auch GetMenuItemCount() sind reine Win32-API Funktionen, die von der MFC-Bibliothek aus intern aufgerufen werden (wie meine Vorschreiber erklärten, baut MFC bekanntlich auf WinAPI auf).Ich z.B. verwende in jeder Funktion eine Überprüfung in etwa der Form:
assert( hwnd_dialog != NULL );D.h. hat hwnd_dialog irgendwann mal den (unerwarteten!) Wert NULL, so erscheint dieser Dialog "Debug Assertion Failed!" (natürlich nur in der DEBUG-Version), ansonsten wird meine Funktion ganz normal abgearbeitet.
phil_z schrieb:
Meine Frage ist halt... wo kommt der Eintrag her? Irendwo muss ja "Calibration" als Menü Eintrag geschrieben sein
Schon mal einfach auf gut Glück in den Sourcen (inkl. möglicher DLLs!) nach diesem String gesucht?
Wenn nicht fündig, dann wird dieser Menüeintrag wohl höchstwahrscheinlich mit einem "zusammengebastelten" String zur Laufzeit erzeugt z.B. mit AppendMenu() o.ä.Martin
-
Hi Martin,
Danke erstmal für die Bemühungen mir zu helfen!!!!
Also versuchen den "Calibration" String irgendwo zu finden, war mein erster Lösungsansatz... leider ohne Erfolg. Es gibt einfach zu viele Dateien um überall zu Suchen.
Also das ASSERT zur Überprüfung ist verstehe ich allerdings weiß ich nicht wo diese m_hMenu Variable genau ermittelt wird. Also das Menü an sich, erstelle ich ja in der Programm.rc Datei. Dort steht unter dem Punkt "Menu" (in der ResourceView) unter Anderem "IDR_MAINFRAME [English (Ireland)]"
Dort habe ich meine eigentlichen vier Menü-Punkte definiert (von denen allerdings nur 3 angezeigt werden, siehe ganz oben). Das merkwürdige ist eben auch, dass der erste Menü Punkt einfach ignoriert wird...
Ich bin mittlerweile wirklich ratlos, ratloser am ratlosesten. Tausend Dank noch mal.
Grüße,
Phil