Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.183 Beiträge
 
Delphi 12 Athens
 
#4

Re: Plugin-System Version 3

  Alt 20. Jul 2009, 09:49
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat