Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Problem mit automatischem freigeben von Interfaces (https://www.delphipraxis.net/171108-problem-mit-automatischem-freigeben-von-interfaces.html)

Elvis 22. Okt 2012 15:38

AW: Problem mit automatischem freigeben von Interfaces
 
Zitat:

Zitat von himitsu (Beitrag 1187912)
Zitat:

Zitat von Elvis (Beitrag 1187909)
Wenn eine Interface-Referenz per const übergeben wird, wird keine autom. Referenzzählung gemacht.

Aber auch nur, wenn es da schon eine Interface-Referenz ist.
Übergibt man eine objektinstans ala TFoo, dann wird diese schon vor dem Methodenaufruf in ein Interface "konvertiert" und dabei wird natürlich kurzzeitig die Referenzzählung beeinflußt.

Nope, wie kommst du da drauf? :gruebel:
"Const" ist eines der wenigen Mittel, mit den man in Delphi überhaupt mit Interfaces arbeiten konnte, wenn man nicht komplett RefCounting genutzt hatte.

himitsu 22. Okt 2012 15:43

AW: Problem mit automatischem freigeben von Interfaces
 
Aber nur doch wenn man schon eine Interface-Referenz hat, welche man da übergeben kann.
Wenn erst soeine Instanz erstellt werden muß, dann sollte diese auch mit gezählt werden, da sie vor der Übergabe lokl in einer temporären Variable zwischengespeichert wird. :gruebel:


[edit]
Das überrascht mich jetzt aber, da ist wirklich kein AddRef :shock:


Delphi-Quellcode:
type
  ITest = interface
    ['{CB192645-8A70-4AB5-8EDD-ADD0304EDC27}']
  end;

  TTest = class(TObject, ITest)
    FRefCount: Integer;
    function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;
    class procedure Test1(const Intf: ITest);
    class procedure Test2(Intf: ITest);
  end;

function TTest.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
  ShowMessage('QueryInterface' + GUIDToString(IID));
  if GetInterface(IID, Obj) then
    Result := 0
  else
    Result := E_NOINTERFACE;
end;

function TTest._AddRef: Integer;
begin
  Inc(FRefCount);
  ShowMessage('_AddRef ' + IntToStr(FRefCount));
end;

function TTest._Release: Integer;
begin
  Dec(FRefCount);
  ShowMessage('_Release ' + IntToStr(FRefCount));
end;

class procedure TTest.Test1(const Intf: ITest);
begin
  if Assigned(Intf) then ;
  ShowMessage('call Test1');
end;

class procedure TTest.Test2(Intf: ITest);
begin
  if Assigned(Intf) then ;
  ShowMessage('call Test2');
end;

procedure TForm11.Button2Click(Sender: TObject);
var
  T: TTest;
  I: ITest;
begin
  ShowMessage('create-o');
  T := TTest.Create;
  ShowMessage('Test1-o');
  TTest.Test1(T);
  ShowMessage('Test2-o');
  TTest.Test2(T);

  ShowMessage('I:=');
  I := T;
  ShowMessage('Test1-i');
  TTest.Test1(I);
  ShowMessage('Test2-i');
  TTest.Test2(I);
  ShowMessage('nil');
  I := nil;

  ShowMessage('Free');
  T.Free;

  ShowMessage('create-i');
  I := TTest.Create;
  ShowMessage('nil');
  I := nil;

  ShowMessage('End');
end;

Elvis 22. Okt 2012 16:45

AW: Problem mit automatischem freigeben von Interfaces
 
Zitat:

Zitat von himitsu (Beitrag 1187931)
Aber nur doch wenn man schon eine Interface-Referenz hat, welche man da übergeben kann.
Wenn erst soeine Instanz erstellt werden muß, dann sollte diese auch mit gezählt werden, da sie vor der Übergabe lokl in einer temporären Variable zwischengespeichert wird. :gruebel:

"const" scheint hier eine Eigenart zu sein, da hierbei keine Zuweisungen passieren können.
Deshalb muss da kein _AddRef oder _Release ausgeführt werden.
Diese 2 Methoden werden innnerhalb von DoSomething aufgerufen, nicht davor/danach. Dass hierbei etwas temporär irgendwo abgelegt wird ist doch unerheblich?
Zitat:

[edit]
Das überrascht mich jetzt aber, da ist wirklich kein AddRef :shock:
Ohne const hätten sie sich Interfaces fast sparen können...


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:25 Uhr.
Seite 2 von 2     12   

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