(Gelöst) SetWindowPos: Unbehandelte Ausnahme während eines Benutzerrückrufs.



  • Das Problem:
    Ich rufe SetWindowPos und Visual Studio 32 2010 Express sagt mir "Unbehandelte Ausnahme während eines Benutzerrückrufs."
    Die Parameter habe ich mehrfach überprüft, die sind ok.
    Trotzdem mag er mein Windowhandle nicht.
    Wenn ich statt meines Windowhandles einfach (HWND)123 eingebe, dann läuft das Programm ohne Laufzeitfehler (Tut natürlich nichts sinnvolles).

    case WM_SIZE:
    	printf("THD->successor %p, rect.left %d, rect.top + HIWORD(lParam) %d, LOWORD(lParam) %d, HIWORD(lParam) %d, SWP_NOZORDER %d\n", THD->successor, rect.left, rect.top + HIWORD(lParam), LOWORD(lParam), HIWORD(lParam), SWP_NOZORDER);
    	SetWindowPos(THD->successor, 0, rect.left, rect.top + HIWORD(lParam), LOWORD(lParam), HIWORD(lParam), SWP_NOZORDER); //put successor below us
    

    Ausgabe:
    THD->successor 00100104, rect.left 100, rect.top + HIWORD(lParam) 130, LOWORD(lParam) 100, HIWORD(lParam) 30, SWP_NOZORDER 4

    00100104 ist auch tatsächlich was mir CreateWindow gegeben hat.

    Das Ganze läuft auf einem aktuellen Win64 7 Pro.

    Per google findet man nur http://www.gamedev.net/topic/565433-my-engine-isnt-working-in-release-mode/, was darauf deutet, dass irgendwas nicht initialisiert ist.

    Weiterhin ist es seltsam, dass das englische Visual Studio eine deutsche Fehlermeldung ausspuckt, was es sonst nicht tut.
    Auf "continue" klicken bringt nichts.

    Vielen Dank für Hinweise.



  • Die Fehlermeldung kommt vermutlich von USER (user32.dll) und nicht vom Studio.

    Trotzdem mag er mein Windowhandle nicht.

    Wohl, er mag es. Wenn er es nicht mögen würde, würde er die Message nicht schicken, und es würde nichts passieren. Genau was du beobachtest wenn du 123 übergibst.

    Setz mal nen Breakpoint in die WindowProc des "THD->successor" Fensters.



  • Bis zur WindowProc des "THD->successor" Fensters kommt er nicht.

    Ich habe das Programm auf WinXP kompiliert und damit den Fehler gefunden.
    Nach CreateWindow wird die entsprechende MessageQueue mit einer WM_CREATE-Message gerufen. Darin gibt es aber einen Segfault (Nullpointer Exception). Nun haben die Genies bei Microsoft dafür gesorgt, dass anstatt den Segfault ans Programm weiter zu geben oder es zu killen einfach ein return machen.

    Hier gibt es eine genauere Beschreibung: http://blog.paulbetts.org/index.php/2010/07/20/the-case-of-the-disappearing-onload-exception-user-mode-callback-exceptions-in-x64/

    Es gibt einen Hotfix von Microsoft der das beheben soll, mitsamt Warnungen wie WARNING This hotfix has not undergone full testing, allerdings muss man sich dafür per Mail registrieren.

    MFG.

    Edit: Der Hotfix funktioniert und ist minimalinvasiv. Nach der Installation ist der Hotfix inaktiv und muss per Registry systemweit oder für einzelne Programme aktiviert werden. Es gibt auch die Möglichkeit, dass ein Programm den Hotfix zur Laufzeit mithilfe von neuen Syscalls aktiviert und deaktiviert. Für Win7x64-Entwickler von 32Bit-Programmen sehr empfehlenswert.

    Edit2: Der Fehler "Unbehandelte Ausnahme während eines Benutzerrückrufs." bleibt, kommt allerdings jetzt beim Segfault und ist leicht zu debuggen.



  • Jo,..

    CreateWindow ruft die WndProc mit der Msg WM_CREATE direkt, und nicht über den MessageQueue, auf bevor das Fenster Handle zurück gegeben wird,...

    greetz


Anmelden zum Antworten