Hallo!
Ich habe das Problem, dass ich so wie es aussieht mal wieder über den Referenzzähler bei Interfaces stolpere. Ich habe eine Komponente basierend auf TWebbrowser, welche ein
HTML-Editor sein soll. Im OnDocumentComplete-Handler erzeuge ich ein TInterfacedObject zum Handling von Javascript-Events (was soweit auch alles funktioniert). Das einzige Problem ist, dass dieses TInterfacedObject genau einmal weniger freigegeben als instantiiert wird und folglich ein Memleak beim Programmende entsteht. Hier erstmal ein bisschen Code:
Delphi-Quellcode:
type
THTMLEditor =
class(TWebbrowser)
private
{ private declarations }
FKeyDownEvent: THtmlEvent;
{...}
procedure THTMLEditor.DoDocumentComplete(ASender: TObject;
const pDisp: IDispatch;
const URL: OleVariant);
begin
GetDocument.body.style.borderStyle:= '
none';
if HasDocument
then begin
FKeyDownEvent:=
NIL;
// <-- Ruft THtmlEvent.Destroy TATSÄCHLICH auf
FKeyDownEvent:= THtmlEvent.Create;
FKeyDownEvent.OnEvent:= DoKeyDownEvent;
FKeyDownEvent.Document:= GetDocument;
GetDocument.onkeypress:= FKeyDownEvent
as IDispatch;
end;
EditMode:= TRUE;
end;
{...}
destructor THTMLEditor.Destroy;
begin
FKeyDownEvent:=
NIL;
// <-- Wird bei Programmende ausgeführt
FBodyHtml.Free;
FInterfaceContainer.Free;
inherited;
end;
{...}
type
THtmlEvent =
class(TInterfacedObject, IDispatch)
{...}
end;
{...}
destructor THtmlEvent.Destroy;
// <-- Wird bei Programmende NICHT ausgeführt
begin
FDocument:=
NIL;
inherited Destroy;
end;
Die Meldung von FastMM lautet, dass genau eine Instanz von THtmlEvent beim Programmende noch existierte und zwar egal wie viele Documents zwischendurch geladen und OnDocumentComplete aufgerufen wurde.