Subclassing problem



  • Hallo!

    Ich habe eine DLL die von einem Binärprogramm geladen wird - ich kenne sein Quellcode leider nicht. Das Programm ruft eine Funktion meiner DLL mit der HWND des Hauptfensters als Paramter.

    Ich subklasse das Fenster und das Fenster beilbt subklassed bis die WM_DESTROY Message gesended wird. Dann wird die alte WNDPROC wieder zurückgestellt und so sollte es eigentlich klappen. Nun, das programm schließt sich, aber ganz am Ende (wenn das Fenster schon zestört ist - nicht mehr sichtbar ist) bekomme ich ein Fehler gemeldet - Access violation an einer Addresse wo meine DLL vorher geladen wahr.

    Hier ist der Quellcode:

    LRESULT CALLBACK DCCVoiceProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    	hwndprocmap_t::const_iterator mypair = mHwndWndprocMap.find(hwnd);
    	WNDPROC oldproc = NULL;
    
    	if(mypair == mHwndWndprocMap.end()){
    		return DefWindowProc(hwnd, uMsg, wParam, lParam);
    	}
    
    	oldproc = mypair->second;
    
    	if(uMsg == WM_DESTROY){
    			SetWindowLongPtr(hwnd, GWLP_WNDPROC, PtrToLong(oldproc));
    			mHwndWndprocMap.erase(hwnd);
    			return CallWindowProc(oldproc, hwnd, uMsg, wParam, lParam);
    	} else {
    			return CallWindowProc(oldproc, hwnd, uMsg, wParam, lParam);
    	}
    }
    

    Bitte, ich brauche dringend Hilfe!

    Tschüss, erstmal



  • Wo genau tritt denn der Fehler auf (Debugger) und warum setzt "ent-subclasst" du das Fenster überhaupt beim Zerstören?!



  • Hi, Flenders!

    Ich weiß leider nicht wie man eine DLL mit einem Debugger testet. Könntest du mir hiermit helfen? Ich habe VS.NET (7.00).

    Also, ich brauche dass das Fenster subklassed bleibt bis es nicht mehr funktional ist, deswegen kann ich nicht früher ent-subklassen.

    Nun, der selbe Fehler passiert auch wenn ich überhaupt nicht ent-subklasse. Wenn ich aber irgendwo in der Mitte des Programms das DLL ablade (und ent-subklasse), passiert kein (sichtbarer) Fehler.



  • Squeel schrieb:

    Nun, der selbe Fehler passiert auch wenn ich überhaupt nicht ent-subklasse. Wenn ich aber irgendwo in der Mitte des Programms das DLL ablade (und ent-subklasse), passiert kein (sichtbarer) Fehler.

    Bist du dir denn sicher, dass der Fehler überhaupt mit dem oben geposteten Code zusammenhängt?!



  • flenders schrieb:

    Bist du dir denn sicher, dass der Fehler überhaupt mit dem oben geposteten Code zusammenhängt?!

    Nein, ich bin mir leider nicht sicher. Wie kann ich das testen? Könntest du mir bitte zeigen wie man den Debugger dafür nutzt?

    Vorher habe ich gesagt, dass kein Fehler passiert, wenn ich die DLL vorzeitig entlade. Daher vermute ich, dass der Fehler beim Zerstören des Programms liegt (wo das DLL immernoch den Hauptfenster subklässt) - also, wenn die WM_DESTROY Meldung prozessiert wird.

    Ich muß einen Weg finden, wie ich das DLL rechtzeitig entlade - bevor das Programm zestört ist.

    Flenders, hast du schonmal Subklassen in dieser Wiese gemacht? Falls du es schon mal ausgeführt hast, könntest du mir bitte deine Methode erklären?

    Vielen Dank für deine Mühe.



  • Habe leider in dieser Richtung noch nie etwas gemacht - aber prüfte auf jeden Fall mal oldproc, bevor du es mit CallWindowProc aufrufst 🙂


Anmelden zum Antworten