[solved] Multithreading: Problem mit Child-Windows



  • Liebe C++-Community,

    Ich habe mit _beginthreadex einen neuen Thread erzeugt, welcher mit CreateWindowEx ein Fenster erzeugt. So weit läuft alles wunderbar.
    Nun wollte ich aus der Prozedur (=lpfnWndProc) dieses Fensters heraus ein weiteres Fenster erzeugen (wieder mit CreateWindowEx), das hat aber nicht funktioniert.

    Ich vermute, dass ich den Thread nicht mit ausreichend Rechten ausgestattet habe, um dieses Child-Window zu erzeugen. Bis jetzt übergebe der Funktion _beginthreadex als 4. Parameter (Security) NULL.
    Laut MSDN kann/sollte stattdessen eine SECURITY_ATTRIBUTES Struktur übergeben werden (http://msdn.microsoft.com/en-us/library/aa379560(v=vs.85).aspx), welche wiederum einen Pointer auf einen SECURITY_DESCRIPTOR enthält (http://msdn.microsoft.com/en-us/library/aa379561(v=vs.85).aspx), der wiederum nicht direkt bearbeitet sondern mit Hilfe einer ganzen Reihe Funktionen definiert werden soll.
    Allerdings sagen mir diese ganzen Funktionen nichts und ich weiß auch nicht was für Auswirkungen das auf den Thread haben würde.

    Wie kann ich einen Thread mit ausreichend Rechten (falls es daran gescheitert ist) ausstatten, damit er nicht nur ein Fenster, sondern dieses dann noch ein weiteres Fenster erzeugen kann?

    Vielen Dank für eure Hilfe!

    LG
    PLM



  • das hat nicht mit den Rechten zu tun.

    Du hast eine Thread erzeugt, in dem das Fenster erstellt wird und sich auch die benötigte message loop befindet?



  • Die Message-Loop ist vorhanden (sonst hätte er das erste Fenster wohl auch nicht richtig erzeugt).
    Die Thread-Funktion sieht so aus: (die Fensterklassen wurden schon früher registriert)

    unsigned __stdcall SecondThread(void* hParam)
    {
        HWND hwnd = CreateWindowEx (WS_EX_LAYERED, WindowClass1, "Titel", WS_POPUP, 200, 200, 500, 300, NULL, NULL, NULL, NULL);
        ShowWindow(hwnd, SW_SHOW);
    
        MSG messages;
    
        while (GetMessage (&messages, NULL, 0, 0))
        {
            TranslateMessage(&messages);
            DispatchMessage(&messages);
        }
    
        return messages.wParam;
    }
    

    Wenn das dieses Fenster in seiner Prozedur den Message WM_CREATE erhält, sollte es das zweite Fenster erzeugen:

    case WM_CREATE:
                hChildWnd = CreateWindowEx(0, WindowClass2, "", WS_CHILD, 20, 20, 480, 280, hwnd, NULL, NULL, NULL);
                ShowWindow(hChildWnd, SW_SHOW);
                break;
    

    Tut es nur leider nicht...



  • Schonmal gecheckt was GetLastError() dazu meint? Dass das irgendwas mit fehlenden Rechten zu tun hat bezweifle ich stark...



  • @dot: Danke für den Tipp, GetLastError() liefert 1407, laut MSDN "Cannot find Window Class".

    Lag daran, dass ich vergessen hatte, die Fensterklasse zu registrieren.
    Kann passieren... 😉



  • Dacht ich mir schon fast 😉


Log in to reply