AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Problem mit automatischem freigeben von Interfaces
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit automatischem freigeben von Interfaces

Ein Thema von Memnarch · begonnen am 20. Okt 2012 · letzter Beitrag vom 22. Okt 2012
Antwort Antwort
Seite 2 von 2     12   
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#11

AW: Problem mit automatischem freigeben von Interfaces

  Alt 22. Okt 2012, 16:38
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?
"Const" ist eines der wenigen Mittel, mit den man in Delphi überhaupt mit Interfaces arbeiten konnte, wenn man nicht komplett RefCounting genutzt hatte.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Problem mit automatischem freigeben von Interfaces

  Alt 22. Okt 2012, 16:43
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.


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


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;
$2B or not $2B

Geändert von himitsu (22. Okt 2012 um 17:00 Uhr)
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#13

AW: Problem mit automatischem freigeben von Interfaces

  Alt 22. Okt 2012, 17:45
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.
"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
Ohne const hätten sie sich Interfaces fast sparen können...
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 04:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz