Zitat von
Henning der zweite:
Das Problem ist nämlich ein anderes: wenn Delphi das übernimmt, ruft es, wenn die Variable "out of Scope" geht, die Methode _Release auf. Und da gegen kann ich nichts tun.
mußt/darfst du auch nicht, denn diese Methode ruft jede "Programmiersprache" auf, wenn da eine Variable ala Interface-Referenz entfernt/freigeeben wird.
Zitat von
Henning der zweite:
Ist das Objekt bereits freigegeben (z.B. weil die
DLL aus dem Speicher entfernt wurde), ruft Delphi _Release eines freigegebenen Objekts auf - und dann knallts.
wie gesagt, dann gib es doch nicht frei
ich hätte nichts gesagt, wenn es nicht ginge
du darfst dann nur dein Objekt nicht von TInterfacedObject oder einem seiner Nachfolger ableiten,
sondern mußt die Methoden für IInterface/IUnknown selber implementieren, bzw. diese Basisklasse verwenden:
Delphi-Quellcode:
// Copyright (c) 1997-2009 FNS Enterprize's™
// 2003-2009 himitsu @ Delphi-PRAXiS
type
//INonRefCountInterface = interface
// ['{00000000-0000-0000-C000-000000000046}']
// function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
// function _AddRef: Integer; stdcall;
// function _Release: Integer; stdcall;
// procedure Free; stdcall;
//end;
// oder in Kurz
INonRefCountInterface = interface(IInterface)
procedure Free; stdcall;
end;
TNonRefCountInterfacedObject = class(TObject, INonRefCountInterface)
protected
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
public
procedure Free; stdcall;
end;
function TNonRefCountInterfacedObject.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
if GetInterface(IID, Obj) then
Result := 0
else
Result := E_NOINTERFACE;
end;
function TNonRefCountInterfacedObject._AddRef: Integer;
begin
Result := 1;
end;
function TNonRefCountInterfacedObject._Release: Integer;
begin
Result := 1;
end;
procedure TNonRefCountInterfacedObject.Free;
begin
inherited Free;
end;
über die zusätzliche Metode Free kann/muß man das Objekt gezielt freigeben,
denn von alleine macht es das ja nun nimmer
PS: falls man das Freigeben von innerhalb des Objectes löst, kann man .Free auch weglassen;
(OK, das (c) kann man ignorieren .... ist ja nix Neus/Weltbewegendes ... aber ich hatte grad Lust drauf)