Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi RefCount nach Erstellung von TInterfacedObject gleich 0 (https://www.delphipraxis.net/165738-refcount-nach-erstellung-von-tinterfacedobject-gleich-0-a.html)

himitsu 13. Jan 2012 17:06

AW: RefCount nach Erstellung von TInterfacedObject gleich 0
 
Dann ist das ein Problem der versteckten Compilermagic.
Wenn der Compiler diesen Cast intern in eine Supports-Anfrage ändert, dann geht das natürlich.


Schade, daß man nicht sieht, ob/wo die Compilermagic einem einen "Streich" speielt.

Uwe Raabe 13. Jan 2012 17:42

AW: RefCount nach Erstellung von TInterfacedObject gleich 0
 
Der saubere Weg seit D2010 ist
Delphi-Quellcode:
as
: http://docwiki.embarcadero.com/RADSt...zen_in_Objekte

Zitat:

Mit dem Operator as kann auch eine Typumwandlung einer Interface-Referenz zurück in das Objekt durchgeführt werden, aus dem sie ermittelt wurde. Diese Typumwandlung gilt für Interfaces, die aus Delphi-Objekten ermittelt wurden.
Aber auch Sir Rufo's Methode geht:

Zitat:

Sie können auch eine normale (unsichere) Typumwandlung einer Interface-Referenz in ein Objekt vornehmen. Diese Methode löst keine Exceptions aus. Der Unterschied zwischen der unsicheren Objekt-in-Objekt-Typumwandlung in der unsicheren Interface-in-Objekt-Typumwandlung ist folgender: die erste Typumwandlung gibt bei inkompatiblen Typen einen gültigen Zeiger zurück, die zweite gibt nil zurück.

s.h.a.r.k 13. Jan 2012 21:57

AW: RefCount nach Erstellung von TInterfacedObject gleich 0
 
Zitat:

Zitat von Sir Rufo (Beitrag 1145814)
Die Referenzzählung erfolgt IMHO erst dann, wenn die Instanz zu einer Interface-Variablen zugeordnet wird.

Probier es mal so
Delphi-Quellcode:
class function TStartupManagerFactory.Create(): IStartupProcess;
var
  StartupProcess : TBaseStartupProcess;
begin
  StartupProcess := TBaseStartupProcess.Create();
  Result := StartupProcess;
  AddStartupCommands(StartupProcess); // Hier mal den Haltepunkt setzen und prüfen
end;

Jup, das hatte ich schon -- siehe den Screenshot ;)

Die Information, dass diese Interface-Zeiger besondere Zeiger sind, wusste ich bisher (leider) noch nicht. Das ändert natürlich die Sachlage etwas ;) danke an euch alle, vor allem die gesamte Diskussion drum herum!

himitsu 13. Jan 2012 22:19

AW: RefCount nach Erstellung von TInterfacedObject gleich 0
 
Zitat:

Zitat von s.h.a.r.k (Beitrag 1145869)
Die Information, dass diese Interface-Zeiger besondere Zeiger sind, wusste ich bisher (leider) noch nicht.

Das ist grade der Sinn von Interfaces. (also einer davon)

Erstmal Trennung von Schnittstelle und Code.
> Man muß nur die Schnittstelle (die Interfacedeklaration) kennen und es ist unwichtig, was sich dahinter versteckt. (bzw. man muß nicht das Innere verraten)

Und die Freigabe regelt das Interface selber.
> Es zählt wie oft es verwendet wird (wieviele Variablen auf es zeigen) und wenn keiner mehr drauf zeigt, gibt es sich selber frei.
> Bei wird die Freigabe extern geregelt ... irgendwer ruft Free auf (wobei es nicht beachtet wird, ob noch eine andere Variable drauf zeigen könnte ... btw. niemand weiß wie oft was verlinkt wird)


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:57 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