Einzelnen Beitrag anzeigen

shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

AW: GDI+: IStream oder TStreamAdapter

  Alt 20. Aug 2012, 19:01
Die 1. Variante ist falsch und die 2. Variante ist richtig.
Der kommentierte Code macht es vielleicht verständlich:
Delphi-Quellcode:
var
  SA : TStreamAdapter;
...
    // hier wird ein Objekt vom Typ TStreamAdapter erzeugt
    sa := TStreamAdapter.Create(JpegData);

    // beim Aufruf wird im Hintergrund aus dem Objekt ein IStream-Interface erzeugt
    // und dessen Referenzzähler um 1 hochgezählt
    Image := TGPBitmap.Create(sa);
    // nach dem Aufruf wird der Referenzzähler um 1 runtergezählt
    // da nun aber der RefCount = 0 ist wird Free & Destroy aufgerufen

    // zu diesem Zeitpunkt ist der StreamAdapter schon tot, obwohl er eigentlich jetzt gebraucht würde
    Graphics.DrawImage(Image, 0, 0, Image.Width, Image.Height);
Rein theoretisch sollte Delphi merken, dass das übergebene IStream-Interface innerhalb von TGPBitmap noch benützt wird.
Dazu müsste die Klasse TGPBitmap intern aber _AddRef() aufrufen, tut es anscheinend aber nicht.
Andreas
  Mit Zitat antworten Zitat