AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Plugin-System Version 3
Thema durchsuchen
Ansicht
Themen-Optionen

Plugin-System Version 3

Ein Thema von Henning der zweite · begonnen am 19. Jul 2009 · letzter Beitrag vom 15. Mai 2011
 
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.383 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)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz