Exception in AfxGetInstanceHandle() nach Umstellung auf Platformtoolset VS2015



  • Hallo,

    ich habe eine Anwendung, die bisher mit Visual Studio VS2015 problemlos übersetzt wurde. Allerdings kam dabei das Platformtoolset Visual Studio 2010 zum Einsatz.

    Es funktionierte alles problemlos.

    Jetzt habe ich es auf das Platformtoolset Visual Studio 2015 geändert und die Release-Version läuft prima. In der Debug-Version kommt es direkt zu einer Exception in der Funktion AfxGetInstanceHandle(). Die Variable afxCurrentInstanceHandle ist NULL.

    Ich lege in der MFC-Dialog-Anwendung ein abgeleitetes Objekt der Klasse CWinApp an, die Exception tritt bereits im Konstruktor der Klasse auf, wenn die Buttons der Oberfläche registriert werden sollen.

    Was habe ich bei der Umstellung falsch gemacht.

    Danke
    Gerd.



  • Bei der Umstellung hast du vermutlich gar nix falsch gemacht.
    Nur solltest du im Konstruktor der App Klasse keine Buttons erzeugen/registrieren/...
    Verschieb das mal in die Main Funktion oder so...



  • Hallo,

    danke für deine schnelle Antwort.

    Die App-Klasse enthält verschiedene Propertypages als Objekte nicht als Zeiger auf die Property-Pages. Diese Objekte werden ja vom Kontruktor der App-Klasse erzeugt. Und beim Anlegen der Resouren der Pages kommt es zur Exception.

    Bisher (mit Platformtoolset Visual Studio 2010) hat es funktioniert.

    Gruß
    Gerd



  • Noch ein Hinweis

    Die Umstellung auf dynamische Anlegen ist wegen dem Vorhandensein einiger Propertypages sehr aufwendig.



  • Ja, und jetzt geht es halt nicht mehr.

    Ich verstehe auch nicht ganz was du mit "App-Klasse enthält verschiedene Propertypages" meinst 😕
    In Dialog-Anwendungen hat man normalerweise überhaupt keine eigene App Klasse, sondern verwendet direkt CWinApp . Und wieso enthält eine App-Klasse (=eine nicht-GUI Klasse) GUI Elemente?

    Und egal was für eine Art MFC Applikation man hat gilt dass man im Konstruktor der App-Klasse quasi *nichts* machen sollte.



  • Hallo,

    sorry, ich habe mich geirrt; es handelt sich um eine SDI-Anwendung (Die ich allerdings von jemand anders übernohmen habe. Und der Original-Autor ist nicht mehr greifbar.)

    Und naturlich habe ich eine CxxxxApp, welche von der CWinApp abgeleitet wurde.

    Scheinbar wurde hier ziemlich viel getrickst vom Original-Autor.

    Gruß
    Gerd



  • Wenns eine SDI-Anwendung ist, dann kannst du ja die Erzeugung der problematischen Sachen einfach nach InitInstance verlegen.

    Und das

    Die Umstellung auf dynamische Anlegen ist wegen dem Vorhandensein einiger Propertypages sehr aufwendig.

    verstehe ich nicht. Kannst du ein Beispiel bringen wo da welcher Aufwand entstehen würde?


  • Mod

    Wie Hustbaer schon schrieb, der Konstruktor ist der falsch Ansatz hier.

    Die MFC muss für bestimmte Dinge selbst erstmal angelaufen sein, und das ist erst in InitInstance garantiert.



  • Danke.

    Dann werde ich es machen, wie du vorgeschlagen hast. Es eilt nicht, so daß ich die Aufgabe noch zurückstellen kann. Die Release-Version läuft problemlos.

    Ich hatte gedacht, daß ich das Problem einfacher in den Griff bekommen könnte.

    Gruß
    Gerd


  • Mod

    Nein! Die Release Version läuft nicht problemlos. Sie liefert nur keinen ASSERT aber an der Stelle in der AfxGetInstanceHandle aufgerufen wird, wird eben kein Handle sondern NULL geliefert!
    "Keine Meldung" bedeutet nicht "Kein Problem".

    Je nach Stelle, kann dies ein Problem sein. In der Klassenregistrierung ist es das in jedem Fall.



  • Martin Richter schrieb:

    "Keine Meldung" bedeutet nicht "Kein Problem".

    👍

    "Im Release läufts aber, und für sowas hab ich jetzt keine Zeit."
    "Mein Unit-Test läuft aber durch."
    "Ja, das ASSERT kommt an der Stelle manchmal, das is normal, einfach auf [ignore] drücken."
    ...

    *seufz*

    Wieso können das nicht alle Leute Programmierer so sehen wie du?



  • Hallo,

    ihr habt sicher recht. Nur dieses Programm wird nur betriebsintern eingesetzt. Dies áber sehr häufig von mehreren Leuten. Und auch die Property-Pages können in der Release-Version problemlos genutzt werden.

    Ich werde es trotzdem demnächst anpassen.

    Was ich nur nicht verstehe ist, warum es mit dem Platformtoolset Visual Studio 2010 problemlos ohne Exception lief.

    Gruß
    Gerd



  • Naja 2010er Toolset bedeutet auch 2010er Libraries, also auch 2010er MFC Library. Versus 2015er MFC Library. Da gibt's halt anscheinend Unterschied.

    Kann jetzt so einfach sein wie dass in der 2010er MFC an der Stelle kein ASSERT steht und in der 2015er schon. Kann aber auch sein dass irgend was anderes im Code der MFC geändert wurde - z.B. etwas was die Initialisierungsreihenfolge angeht.

    Wenn du es genau wissen willst, dann drück halt auf Retry und guck dir an warum das ASSERT fliegt.
    Und dann setz nen Breakpoint in der mit 2010er Toolset gebauten Version und guck warum es dort nicht passiert.
    Dann weisst du es 🙂


Log in to reply