Programm in DllMain in gleichem Prozess und Thread



  • Hallo,

    ich habe ein Problem mit meiner aktuellen Anwendung. Und zwar geht es darum eine andere, fremde Anwendung (von der ich keinen Source-Code habe) um ein Child-Fenster zu erweitern. Das geht, weil die Anwendung beim starten eine bestimmte Dll lädt. Wenn ich diese dll durch meine eigene mit dem gleichen Namen ersetze, wird diese dll geladen und ich kann dort Code ausführen. Soweit so gut, so komme ich "in" die Anwendung rein.

    Der Code dazu sieht etwa so aus:

    unsigned __stdcall on_startup(void *arg_list)
    {
        // Erstelle child window und message loop hier und nutze SetParent zum hinzufügen des Fensters
    }
    
    BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
    {
    	switch (ul_reason_for_call)
    	{
    	case DLL_PROCESS_ATTACH: 
    		_beginthreadex(nullptr, 0, on_startup, nullptr, 0, nullptr);
    		break;
    	case DLL_THREAD_ATTACH:
    	case DLL_THREAD_DETACH:
    	case DLL_PROCESS_DETACH:
    		break;
    	}
    	return TRUE;
    }
    

    Das geht auch, die Anwendung wird korrekt um ein zusätzliches Fenster erweitert und alles läuft. Allerdings ist das neue Child-Fenster in einem anderen Thread unterwegs als sein Parent-Fenster, was ja durch den _beginthreadex call erklärt werden kann.

    Die Kommunikation der beiden Fenster ist aber recht langsam und ich vermute dass das daran liegt, dass sich diese in zwei verschiedenen Threads aufhalten. Ich weiß dass es anders geht; für die selbe Anwendung wurde schonmal so ein Program geschrieben (von diesem habe ich leider auch keinen Source Code) welches das gleiche Prinzip verwendet.

    In diesem Program hat das künstlich erzeugte Child-Window die gleiche Thread-ID (ermittelt über Spy++) wie das Parent-Fenster und die Kommunikation läuft wunderbar schnell. Ich will das gleiche erreichen, leider weiß ich nicht wie, denn:

    • Wenn ich die Message loop in DllMain starte (also nicht in einem neuen Thread), blockiert das die ganze Anwendung, da diese darauf wartet dass DllMain return'ed
    • Ich benutze also deswegen einen neuen Thread um dieses Blockieren zu verhindern
    • Ich hab auch gelesen dass man in DllMain eigentlich gar keine Threads starten sollte, daher vermute ich ist der Ansatz so eher schlecht?

    Auf jeden Fall: Wie könnte ich in dem oben beschriebenen Szenario das Child-Window erstellen ohne einen neuen Thread zu erstellen und ohne DllMain zu blockieren? Ich weiß dass es irgendwie möglich sein muss, komme aber nicht mehr weiter...



  • Du kannst Funktionen wie GetMessageA/W hooken und dann dein Fenster erstellen.



  • roflo schrieb:

    Du kannst Funktionen wie GetMessageA/W hooken und dann dein Fenster erstellen.

    Omg das ist es 😮

    Habs grade getestet und es läuft! Vielen Dank, das ist endlich die Lösung (ich ärger mich schon länger mit diesem Problem herum aber erst jetzt ist es akut geworden) 👍


Log in to reply