GDI+ /WinAPI Absturz bei Exit

  • Ich lasse mehrere .png's auf einer GUI zeichnen (als Ersatz für Buttons), der Code für die jeweiligen Buttons sieht so aus;

    Code
    ;Exit
    $h_Exit_Pic = GUICtrlCreatePic("", @DesktopWidth - 18, 2)
    $h_Exit_hImage = _GDIPlus_ImageLoadFromFile("Skin\Power.png")
    $h_Exit_Bmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($h_Exit_hImage)
    _WinAPI_DeleteObject(GUICtrlSendMsg($h_Exit_Pic, 0x0172, 0, $h_Exit_Bmp))

    Was auch wunderbar funktioniert, alles wird richtig angezeigt, ist klickbar, etc.
    In der Funktion "OnExit" die mit dem Button verlinkt ist passiert dann folgendes für jeden Button;

    Code
    _WinAPI_DeleteObject($h_Exit_hImage)
    _GDIPlus_ImageDispose($h_Exit_Bmp)

    Was allerdings beim aufrufen der OnExit() Funktion zu einem Fehler führt (keine Meldung, ein einfaches "hat einen Fehler festgestellt und musste beendet werden").
    Lasse ich die beiden Befehle weg, beendet es sich alles normal aber die Ressourcen werden eben nicht freigegeben.

    Irgendwer eine Idee wodurch der Absturz entsteht?

    Interessant wäre auch noch, ob es möglich ist unter so erstellte GDI+ images ein weiteres (nicht zwingend transparentes) Bild anzuzeigen.

  • Dieses Phänomen lässt sich im Grunde ganz einfach erklären. Du weißt deinen IMAGE Objekt den HBITMAP Objekt zu. Das Problem ist aber, dass du das IMAGE Objekt zuerst löscht. Dadurch besteht weiterhin die Abhängigkeit auf auf einen leeren Speicherbereich. Dadurch kommt es zu dem Programmabsturz. Tausche einfach beide Funktionen in ihrer Reihenfolge und es läuft. :)

  • Das dachte ich zuerst auch, allerdings;


    Das ist mal die komplette OnExit Function so weit (ersetzt im Moment meine Taskleiste, das Script o;) und sobald sie aufgerufen wird
    stürtzt mir das Script mit exakt der gleichen Fehlermeldung wieder ab. :/
    Ist das erste mal das ich GDI+ benutze, da ich bisher alles mit nicht-transparenten Grafiken gemacht habe. :p

  • Da kann ich dir so nicht helfen, ich brauche da dann entweder den kompletten ausführbaren Sourcecode oder ein Minimal-Beispiel welches den Fehler reproduziert.

  • Für das komplette Script würden die Grafiken fehlen (und die Taskleiste wird beim Error nicht wieder eingeblendet, wäre für dich ungünstig :D)
    aber das hier läuft (siehe Kommentare im Script) und haut exakt den gleichen Fehler raus;

    • Offizieller Beitrag

    Du verwendest die falschen Befehle zum löschen der Bitmaps!
    $h_Exit_hImage ist eine GDIPlus-Bitmap und muss mit _GDIPlus_ImageDispose gelöscht werden.
    $h_Exit_Bmp ist eine GDI-Bitmap und muss mit _WinAPI_DeleteObject gelöscht werden.
    Also genau anders herum, wie Du es in dem Beispiel geschrieben hast.