Eigene Messages erstellen ...



  • Eine einfachere alternative Lösung wäre die Verwendung von PostThreadMessage. Kann von jedem Prozess oder Thread zu einem Thread gesendet werden. Die Empfänger-Thread-ID muß aber bekannt. Entweder über die Registry (eintragen vom Thread und ausleses vom Message-Sender) oder über einen gemeinsam bekannten Klassennamen. Vor- und Nachteile muß jeder selber abwägen.
    Ich wollte nur zeigen, dass es noch mindestens eine Lösung mehr gibt.

    Blackbird



  • hi,
    ich glaube jemand hat bei WM_PAINT : BeginPaint () und EndPaint () vergessen



  • Also ich habe das mit WM_COPYDATA jetzt hinbekommen. Der String kommt an das blöde ist nur das ab und zu mal so komisches Zeugs mit auftaucht wo ich mir nicht reklären wo jetzt der Fehler liegen soll.

    Hier noch mal die beiden Listings:

    Client:

    #include <windows.h>
    #include <string.h>
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    void    SendCmd (HWND, HWND, char*);
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow)
    {
        char        szAppName[] = "DX-Client";
        MSG         msg;
        WNDCLASSEX  wndclass;
        HWND        hwnd;
    
        wndclass.cbSize         = sizeof (wndclass);
        wndclass.style          = CS_HREDRAW | CS_VREDRAW;
        wndclass.lpfnWndProc    = WndProc;
        wndclass.cbClsExtra     = 0;
        wndclass.cbWndExtra     = 0;
        wndclass.hInstance      = hInstance;
        wndclass.hIcon          = LoadIcon (NULL, IDI_APPLICATION);
        wndclass.hCursor        = LoadCursor (NULL, IDC_ARROW);
        wndclass.hbrBackground  = (HBRUSH) GetStockObject (WHITE_BRUSH);
        wndclass.lpszMenuName   = NULL;
        wndclass.lpszClassName  = szAppName;
        wndclass.hIconSm        = LoadIcon (NULL, IDI_APPLICATION);
    
        RegisterClassEx (&wndclass);
    
        hwnd = CreateWindow (szAppName, "DX-Client", WS_OVERLAPPEDWINDOW,
                             CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
                             NULL, NULL, hInstance, NULL);
    
        ShowWindow (hwnd, iCmdShow);
        UpdateWindow (hwnd);
    
        while (GetMessage (&msg, NULL, 0, 0))
        {
            TranslateMessage (&msg);
            DispatchMessage (&msg);
        }
    
        return msg.wParam;
    }
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
    {
        HWND                hwnd_Server;
        STARTUPINFO         StartupInfo;
        PROCESS_INFORMATION ProcessInformation;
    
        switch (iMsg)
        {
            case WM_CREATE:
                ZeroMemory(&StartupInfo, sizeof(STARTUPINFO));
                ZeroMemory(&ProcessInformation, sizeof(PROCESS_INFORMATION));
    
                CreateProcess ("DX-Server.exe", NULL, NULL, NULL, false, NORMAL_PRIORITY_CLASS, NULL, NULL, &StartupInfo, &ProcessInformation);
    
                CloseHandle(ProcessInformation.hProcess);
                CloseHandle(ProcessInformation.hThread);
                return 0;
            case WM_PAINT:
                SendCmd (NULL, FindWindow("DX-Server",NULL),"Test-String\0");
                return 0;
            case WM_DESTROY:
                hwnd_Server = FindWindow("DX-Server","DX-Server");
                SendMessage(hwnd_Server, WM_CLOSE, NULL ,NULL);
                PostQuitMessage (0);
                return 0;
        }
    
        return DefWindowProc (hwnd, iMsg, wParam, lParam);
    }
    
    void SendCmd (HWND Sender, HWND Empfaenger, char* Commando)
    {
        COPYDATASTRUCT *    cds;
        cds = new COPYDATASTRUCT;
        cds->cbData = sizeof(char) * strlen(Commando);
        cds->lpData = Commando;
        cds->dwData  = NULL;
        SendMessage(Empfaenger, WM_COPYDATA, (WPARAM) Sender, (LPARAM) cds);
    
        free(cds);
    }
    

    Server:

    #include <windows.h>
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow)
    {
        char        szAppName[] = "DX-Server";
        HWND        hwnd;
        MSG         msg;
        WNDCLASSEX  wndclass;
    
        wndclass.cbSize         = sizeof (wndclass);
        wndclass.style          = CS_HREDRAW | CS_VREDRAW;
        wndclass.lpfnWndProc    = WndProc;
        wndclass.cbClsExtra     = 0;
        wndclass.cbWndExtra     = 0;
        wndclass.hInstance      = hInstance;
        wndclass.hIcon          = LoadIcon (NULL, IDI_APPLICATION);
        wndclass.hCursor        = LoadCursor (NULL, IDC_ARROW);
        wndclass.hbrBackground  = (HBRUSH) GetStockObject (WHITE_BRUSH);
        wndclass.lpszMenuName   = NULL;
        wndclass.lpszClassName  = szAppName;
        wndclass.hIconSm        = LoadIcon (NULL, IDI_APPLICATION);
    
        RegisterClassEx (&wndclass);
    
        hwnd = CreateWindow (szAppName, "DX-Server", WS_OVERLAPPEDWINDOW,
                             CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
                             NULL, NULL, hInstance, NULL);
    
        ShowWindow (hwnd, iCmdShow);
        UpdateWindow (hwnd);
    
        while (GetMessage (&msg, NULL, 0, 0))
        {
            TranslateMessage (&msg);
            DispatchMessage (&msg);
        }
    
        return msg.wParam;
    }
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
    {
        switch (iMsg)
        {
            case WM_DESTROY:
                PostQuitMessage (0);
                return 0;
            case WM_COPYDATA:
                COPYDATASTRUCT * cds;
                cds = (COPYDATASTRUCT *)lParam;
                MessageBox(NULL,(char *) cds->lpData, "Message", MB_OK);
                return 0;
        }
    
        return DefWindowProc (hwnd, iMsg, wParam, lParam);
    }
    

    und hier mal das komische Zeugs was ab und zu mal in der MessageBox auftaucht:

    http://marco.kaminski.bei.t-online.de/files/gedoens.JPG

    [ Dieser Beitrag wurde am 14.04.2003 um 11:46 Uhr von DarkMight1 editiert. ]



  • Ein Tip ins Blaue: Du hast das abschließende Nullbyte vergessen, oder?
    [cpp]
    cds->cbData = sizeof(char) * strlen(Commando) + 1;[/cpp]



  • Deshalb habe ich ja an den übertragenen String \0 mit drangehangen.

    SendCmd (NULL, FindWindow("DX-Server",NULL),"Test-String\0");
    

    Aber das hilft wohl nichts, jetzt funktioniert es jedenfalls !!!

    [ Dieser Beitrag wurde am 14.04.2003 um 14:51 Uhr von DarkMight1 editiert. ]



  • Also... entweder schickst du den String mit 0 rüber, oder du hängst sie serverseitig an die empfangene Zeichenfolge.

    SendCmd (NULL, FindWindow("DX-Server",NULL),"Test-String\0");
    

    hilft natürlich nix!
    [cpp]
    cds->cbData = sizeof(char) * strlen(Commando); // Länge des Strings ohne 0 Zeichen![/cpp]
    ergibt 11, weil strlen das abschließende 0-Zeichen nicht mitzählt. Deshalb sollst du ja noch 1 dazu addieren.
    sizeof(char) * strlen("Test-String\0") == 1 * strlen("Test-String\0") == 11

    Klar?



  • Lass das '\0' in der Definition des Test-Strings weg!
    Und:

    COPYDATASTRUCT cds;
        cds.cbData = sizeof(char) * lstrlen(Commando) + 1;
        cds.lpData = (LPVOID)Commando;
        cds.dwData  = 0;
        SendMessage(Empfaenger, WM_COPYDATA, (WPARAM)Sender, (LPARAM)cds);
    

    Und wenn du schon unbedingt new benutzen willst, dann lösche den Speicher mit delete.

    [ Dieser Beitrag wurde am 14.04.2003 um 16:41 Uhr von WebFritzi editiert. ]



  • Ha da hat der Fritz! ja doch noch nen Fehler gemacht 😃

    Rate doch mal welchen Fehler ich bei folgender Zeile bekomme:

    SendMessage(Empfaenger, WM_COPYDATA, (WPARAM)Sender, (LPARAM)cds);
    

    Mal gespannt ob du den Fehler findest !!



  • Man darf doch mal ein '&' vergessen, oder? 😉 Läuft's denn jetzt?

    [EDIT]
    Um mal deine Homepage aufzupolieren, kannst ja mal das "seid" in "seit" umändern neben dem Counter. 😉
    [/EDIT]

    [ Dieser Beitrag wurde am 15.04.2003 um 01:12 Uhr von WebFritzi editiert. ]



  • Hey richtig, ja jetzt läuft es.

    Ja meine HP könnte mal wieder nen Update vertragen mal schauen die nächsten Tage habe ja jetzt URLAUB und damit ein wenig Zeit 🙂

    Hat mich diese blöde M$ Frontpage nicht auf diesen Fehler hingewissen na warte das gibt ne fette Klage 😃


Anmelden zum Antworten