Absturz nach SetWindowLong



  • Hallo,

    Ich steuer eine Anwendung fern und leite dazu mittels SetWindowLong um. Leider stürtzt mir die Anwendung, die ich steuer danach bei bestimmten Funktinen ab, auch wenn ich in meiner "neuen" WndProc nur die alte aufrufe:

    LRESULT CALLBACK MainProcessProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    return CallWindowProc( (WNDPROC)lMainSISProc, hWnd, message, wParam, lParam );
    }
    

    Ich will eigentlich nur das WM_CLOSE abfange, bevor es die Anwendung kriegt. Leider hat das mit einem Hook nicht geklappt (wäre mir irgendwie lieber). Wie kann sowas sein?



  • Du kannst mit SetWindowLong (bzw. das neuere SetWindowLongPtr) nicht die WndProc eines Fensters austauschen, das nicht zu deinem Prozess gehört.
    Der fremde Code und deiner liegen in unterschiedlichen "Segmenten", deswegen blockiert Windows den Aufruf und lässt das Programm abstürzen.

    Eine Hook wäre vielleicht doch geeigneter. Mit einer GetMessage-Hook sollte man auch WM_CLOSE abfangen können.



  • Dat Ding gehört schon zu meinem Process. Das funktioniert ja auch bei allen ChildWindows. Ich binde dor mit einer Makro - sprache meine Hook Dll ein. Es scheint so, das er beim Hauptfenster es einfach nicht mag, wenn ich daran rummanipuliere...

    Bei dem Hook kriege ich einfach kein WM_CLOSE des Hauptfensters, dafür aber jedes andere WM_CLOSE( jede Messagebox in der Anwendung ). Also checke ich ab mit:

    case WM_CLOSE:
    {
    if( pMsg->hwnd == g_hAnalySISMainWnd ){
    //tue mein close zeugs...
    }....

    aber da komme ich nie vorberi...( WM_DESTROY auch nicht )

    Was ist eigentlich am "neuen" SetWindowLongPtr anders??



  • Achja, was mein HOOK mir perfekt liefert sind WM_NULL Messages beim Schließen - leider kriege ich die auch beim Start -> wie kann ich das unterscheiden....
    Ich glaube ich werd mir einfach mal die Message - Historie anschauen, um da vielleicht ein paar analogien zwischen Ende und Start zu finden.... was 'ne Lösung 🙄



  • Sooo, das Problem scheint zumindest gelöst. Irgendwo kommt beim Beenden eine abenteuerliche - Userdefined Message( 1237468 ). Die kriege ich sauber in meiner HookProc() und juut is :).

    Mich interessiert trotzdem, wie dieser Absturz bei SetWindowLong zustande kommen kann. Normalerweise sollte sich die Anwendung doch nach dem Umhängen der Messageque und dem Aufrufen von CallWindowProc genauso verhalten, wie vorher, oder?



  • Ist lMainSISProc global (gültig) und ist der Code in einer DLL im Adressraum des zu überwachenden Prozesses?!



  • Ja, ist er. Sonst würde es ja mit den Childfenstern auch nicht funktionieren.

    Es ist auch komisch, das ich mit dem Hook(WH_CALLWNDPROC), das WM_CLOSE nicht kriege, wenn ich mit SetWindowLong umhänge aber schon.
    Die Anwendung, die da steuere ist sowieso a bissel komisch, was da an User - defined messages umherfliegt, ist schon super. Außerdem werden die Visualisierungsfenster mit 'nem Timer upgedated tststs... was will man da noch erwarten...


Anmelden zum Antworten