[gelöst] Programm beendet sich gleich wieder ...



  • Servus,

    kann mir bitte jemand sagen warum dieses Programm sich sofort wieder beendet ?
    Rückgabewert ist 0, also keine Syntaxfehler.

    #include <windows.h>
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    
    char szAppName[ ] = "IDE";
    HINSTANCE hInstance ;
    HINSTANCE hSciLexer ;
    #define ID_SCINTILLA    1
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                         LPSTR lpszArgument, int nCmdShow)
    {
        HWND hWnd ;
        MSG nMsg ;
        WNDCLASSEX WndClass ;
    
        WndClass.hInstance     = hInstance ;
        WndClass.lpszClassName = szAppName ;
        WndClass.lpfnWndProc   = WndProc ;
        WndClass.style         = CS_HREDRAW | CS_VREDRAW ;
        WndClass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
        WndClass.hIconSm       = LoadIcon (NULL, IDI_APPLICATION) ;
        WndClass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
        WndClass.lpszMenuName  = szAppName ;
        WndClass.cbClsExtra    = 0 ;
        WndClass.cbWndExtra    = 0 ;
        WndClass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH) ;
    
        if (!RegisterClassEx (&WndClass))
            {
                MessageBox(hWnd,
                "The window class could not be registered.",
                szAppName, MB_OK | MB_ICONERROR) ;
                return 0 ;
            }
    
        hWnd = CreateWindowEx (0, szAppName, szAppName,
               WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
               CW_USEDEFAULT, CW_USEDEFAULT, 644, 475,
               NULL, NULL, hInstance, NULL) ;
    
        ShowWindow (hWnd, nCmdShow) ;
        UpdateWindow (hWnd) ;
    
        while (GetMessage (&nMsg, NULL, 0, 0))
        {
            TranslateMessage(&nMsg) ;
            DispatchMessage(&nMsg) ;
        }
    
        return nMsg.wParam ;
    }
    
    LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        static HWND      hWndEdit ;
    
        hSciLexer = LoadLibrary("SciLexer.DLL") ;
                if (hSciLexer == NULL)
                {
                    MessageBox(hWnd,
                    "The Scintilla DLL could not be loaded.",
                    "Error loading Scintilla",
                    MB_OK | MB_ICONERROR) ;
                    return -1 ;
                }
    
        switch (message)
        {
            case WM_CREATE :
    
                hWndEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "Scintilla", "",
                                          WS_CHILD | WS_VISIBLE | WS_TABSTOP,
    		                              10, 10, 500, 400,
    		                              hWnd,(HMENU) ID_SCINTILLA, hInstance, NULL) ;
                return 0 ;
    
            case WM_DESTROY :
    
                PostQuitMessage (0) ;
                return 0 ;
        }
    
        return DefWindowProc (hWnd, message, wParam, lParam) ;
    }
    

    Seid bitte nicht zu streng mit mir, ich bin noch Anfänger ... 🙄

    Vielen Dank für die Aufmerksamkeit.

    Gruß
    Greenhorn



  • hSciLexer = LoadLibrary("SciLexer.DLL") ;
                if (hSciLexer == NULL)
                {
                    MessageBox(hWnd,
                    "The Scintilla DLL could not be loaded.",
                    "Error loading Scintilla",
                    MB_OK | MB_ICONERROR) ;
                    return -1 ;
                }
    

    Evtl. liegts an dieser stelle hier im code, dass wenn hier nämlich das return
    -1, kommt kein return DefWindowProc mehr kommen kann. Sprich er findet deine DLL nicht, du solltest das auch besser in die WM_CREATE paacken sonst wird das nämlich bei jedem Durchlauf deiner WindowProc ausgeführt. Obwohl wenn das fehlschlägt eigentlich ne Messagebox kommen müsste?
    Naja packs einfach mal in die WM_CREATE.

    Gruß Tobi.



  • Hi,
    ich habe gerade mit deinem Quellcode ein bissle rumgespielt und bin zum ergebnis gekommen das dein Fenster nicht regisriert werden konnte:

    if (!RegisterClassEx (&WndClass))
            {
                MessageBox(hWnd,
                "The window class could not be registered.",
                szAppName, MB_OK | MB_ICONERROR) ;
                return 0 ;
            }
    

    Dein Programm hüpft hier in den If-Teil hinein zeigt aber die MessageBox ned an, da "hWnd" ja keine gültiger Handle zu einem Fenster ist.
    Würdeste ja erst hier zuweisen:

    hWnd = CreateWindowEx (0, szAppName, szAppName,
               WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
               CW_USEDEFAULT, CW_USEDEFAULT, 644, 475,
               NULL, NULL, hInstance, NULL) ;
    

    Also einfach da mal "NULL" angeben und schon müsste die MessageBox erscheinen.

    Was aber jetzt an deinem WndClass falsch ist ka sorry.

    Ich hab mal GetLastError() ausgewertet:
    Error Nr: 87 Text: Falscher Parameter

    MFG PinguGroup



  • Danke für den Tip, aber das hatte ich zuerst auch so, mit dem gleichen Ergebnis.
    Selbst wenn ich den WM_CREATE-Zweig leer lasse passiert das Gleiche ...

    ... oO

    sehe gerade die zweite Antwort ...

    Ja, das habe ich mir schon gedacht, das es an der WndClass liegt, aber warum ... ?
    Sehr merkwürdig *frust*

    Gruß



  • Tatsache, mit der NULL klappt's auch mit dem Nachbarn, aber leider das falsche Fenster 🙄 😃

    Ich werde die Nase noch mal in den Petzold stecken ...



  • Also, wenn ich anstatt WNDCLASSEX und RegisterClassEx nun WNDCLASS und RegisterClass nehme, dann geht alles seinen Gang. 🙂

    Liegt es vielleicht an meiner IDE ?
    Ich benutze Code::Blocks v8.0.2 ...

    Gruß



  • Ahhh, ich hab's.

    Bei WNDCLASSEX fehlte der Parameter

    WndClass.cbSize = sizeof (WNDCLASSEX);
    

    Tja, der gute Petzold ist ja auch schon etwas in die Jahre gekommen ... 🙄
    Die ganzen *Ex Funktionen sind mir neu, oder besser gesagt nicht im Buch - jedenfalls nicht alle -

    Jetzt läuft's, vielen Dank noch einmal an euch beiden für die Hilfe !!!

    Gruß
    C++Greenhorn


Anmelden zum Antworten