bei DestroyWindow(hWnd) kommt immer eine Fehlermeldung



  • Ich schreib grad ein kleines prog bei dem ich kurz ein fenster brauch, aber es klappt nicht so richtig.
    Na ja, das Fenster und so klappt alles, nur beim beenden kommt immer ein Fehler, vonwegen "The Value of ESP was not properly saved across a function call" und zwar, wenn ich die funktion

    DestroyWindow(hWnd);
    

    aufruf.
    Mach ich da was falsch?



  • liegt bestimmt nicht an dieser zeile



  • die datei, wo die funktionen stehen

    WNDCLASSEX wndClass;
    HWND hWnd;
    int Maximized;
    char Name[5];
    
    HRESULT OpenWindow(int Windowed, WNDPROC MsgProc, HINSTANCE Inst, char* Title)
    {
      strcpy(Name, Title);
      Maximized = !Windowed;
      wndClass.cbSize = sizeof(WNDCLASSEX);
      wndClass.cbClsExtra = NULL;
      wndClass.cbWndExtra = NULL;
      wndClass.style = CS_HREDRAW | CS_VREDRAW;
      wndClass.hCursor = NULL;
      wndClass.hIcon = NULL;
      wndClass.hIconSm = NULL;
      wndClass.hInstance = Inst;
      wndClass.lpszMenuName = NULL;
      wndClass.lpszClassName = APP_CLASSNAME;
      wndClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
      wndClass.lpfnWndProc = MsgProc;
    
      ShowCursor(FALSE);
    
      RegisterClassEx(&wndClass);
    
      if (!Windowed)
      {
        if ((hWnd = CreateWindow(APP_CLASSNAME, Title, WS_MAXIMIZE | WS_VISIBLE | WS_POPUP,
            100, 100, 500, 500, GetDesktopWindow(), NULL, Inst, NULL)) == 0)
        return APP_E_HANDLE;
      }
      else
        if ((hWnd = CreateWindow(APP_CLASSNAME, Title, WS_POPUP | WS_VISIBLE | WS_OVERLAPPEDWINDOW,
            100, 100, 500, 500, GetDesktopWindow(), NULL, Inst, NULL)) == 0)
        return APP_E_HANDLE;
    
      return SUCCESS;
    }
    
    void ProcessMessages()
    {
      MSG msg;
      while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
      {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
      }
    
    }
    
    void CloseWindow()
    {
      PostMessage(hWnd, WM_CLOSE, 0, 0);
      UnregisterClass(APP_CLASSNAME, wndClass.hInstance);
    }
    
    void SwitchMaxim()
    {
      Maximized = !Maximized;
      DestroyWindow(hWnd);
      if (Maximized)
      {
        if ((hWnd = CreateWindow(APP_CLASSNAME, Name, WS_MAXIMIZE | WS_VISIBLE | WS_POPUP,
            100, 100, 500, 500, GetDesktopWindow(), NULL, wndClass.hInstance, NULL)) == 0)
        return;
      }
      else
        if ((hWnd = CreateWindow(APP_CLASSNAME, Name, WS_POPUP | WS_VISIBLE | WS_OVERLAPPEDWINDOW,
            100, 100, 500, 500, GetDesktopWindow(), NULL, wndClass.hInstance, NULL)) == 0)
        return;
    }
    


  • benutzt du irgendwo LoadLibrary und GetProcAddress?



  • das ganze liegt in 'ner dll, warum?



  • dann liegt es vielleicht am programm das die dll benutzt. sofern du da LoadLibrary/GetProcAddress benutzt



  • Die Pointer auf die Funktion stimmen. Ich bin deshalb der Meinung, dass es bei der DestroyWindow fehlt, weil ich die funktion in SwitchMaxim() rausgenommen hab unds da ganz gut geklappt hat... (wenn ich SwitchMaxim aufgerufen hab)



  • überprüf mal die calling conventions. __stdcall/WINAPI oder __cdecl



  • Ist den hWnd zu diesem Zeitpunkt überhaupt ein gültiges Handle?!



  • decl schrieb:

    überprüf mal die calling conventions. __stdcall/WINAPI oder __cdecl

    Das ist ein ganz heißer Tip! 💡 👍



  • 🙂



  • 1. Was genau sind "calling conventions"? (Ich hab die Hilfe nur auf Englisch und bin da nicht so gut
    2. Wie überprüf ich die?



  • gast schrieb:

    1. Was genau sind "calling conventions"?

    Die calling convention legt fest, wie der Compiler die Parameter übergibt (von rechts nach links oder andersrum), wer für den Stack verantwortlich ist und so ein Kram. Wenn man beim Aufrufen eine andere calling convention benutzt als beim deklarieren, stürzt das Programm meistens ab.

    (Ich hab die Hilfe nur auf Englisch und bin da nicht so gut

    btw: Englisch wirst du lernen müssen, wenn du programmieren willst. Ein Großteil der Fachliteratur ist in Englisch verfasst.

    2. Wie überprüf ich die?

    Schau nach, ob WINAPI, CALLBACK, __cdecl o.ä. vor der Funktion steht (je nachdem, was benötigt wird).



  • Folgendes:
    Am Aufruf der Funktion DestroyWindow liegts auch nicht, denn mit

    PostMessage(hWnd, WM_CLOSE, 0, 0);
      UnregisterClass(APP_CLASSNAME, wndClass.hInstance);
    

    krieg ich die selbe Fehlermeldung -> es könnt am handle liegn. Das CreateWindow funktioniert aber, wie krieg ich raus, ob es sich um ein gültiges Handle handelt?





  • des Handle isn window 😞
    woran könnts sonst noch liegen? (mir fällt irgendwie keine andere möglichkeit ein)



  • schön das du das mit den calling conventions ignorierst...



  • schöner schrieb:

    schön das du das mit den calling conventions ignorierst...

    ...zumal es genau des Rätsels Lösung ist.

    Beispiel für einen bei Google gefundenen Link

    Oder halt selber mal bei Google nach "The Value of ESP was not properly saved" suchen...

    Aber man kann natürlich auch weiterhin an der falschen Ecke herumdoktorn... 🙄

    ESP heißt übrigens "Extended Stack Pointer"... 😮



  • Hepi schrieb:

    schöner schrieb:

    schön das du das mit den calling conventions ignorierst...

    ...zumal es genau des Rätsels Lösung ist.

    Beispiel für einen bei Google gefundenen Link

    Oder halt selber mal bei Google nach "The Value of ESP was not properly saved" suchen...

    Aber man kann natürlich auch weiterhin an der falschen Ecke herumdoktorn... 🙄

    ESP heißt übrigens "Extended Stack Pointer"... 😮

    Ok:
    Warum ich nicht glaube, dasses beim Aufruf der Funktion in der DLL liegt.
    folgende Funktion ist in einer DLL gespeichert und wird über den Pointer auf die Funktion aufgerufen:

    void CloseWindow()
    {
      return;
    }
    

    Der Aufruf klappt Perfekt, es gibt kein problem, keine Fehlermeldung.
    nun füge ich die (meiner meinung nach Problem-)zeile hinzu

    void CloseWindow()
    {
      DestroyWindow(hWnd);
    }
    

    kompiliere die DLL neu, führ das Prog nochmal aus und tada, kommt die Fehlermeldung.
    Das selbe kommt übrigens, wenn ich das fenster anders schließen will:

    void CloseWindow()
    {
      PostMessage(hWnd, WM_CLOSE, 0, 0);
      UnregisterClass(APP_CLASSNAME, wndClass.hInstance);
    }
    

    Ich weiß nicht, obs an mir, den Calling Conventions oder was anderem liegt.



  • gast schrieb:

    Ich weiß nicht, obs an mir, den Calling Conventions oder was anderem liegt.

    Aber wir wissen es.

    Und wir haben es Dir nun oft genug gesagt.

    Da Du es nachhaltig ignorierst, liegt es auch an Dir und nicht nur an den Calling Conventions, da könntest Du allerdings Recht haben... 🙄


Log in to reply