AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Hab' ich das richtig verstanden mit DelphiCOM ?
Thema durchsuchen
Ansicht
Themen-Optionen

Hab' ich das richtig verstanden mit DelphiCOM ?

Ein Thema von Dezipaitor · begonnen am 10. Sep 2007 · letzter Beitrag vom 10. Sep 2007
Antwort Antwort
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#1

Hab' ich das richtig verstanden mit DelphiCOM ?

  Alt 10. Sep 2007, 21:47
Hab' ich das richtig verstanden mit DelphiCOM ?

Wenn ich eine Klasse von TInterfaceObject ableite, dann übernimmt Delphi das Referencecounting
für Instanzen meiner Klasse?
Sobald die Variable außerhalb des Gültigkeitsbereichs geht, ruft Delphi automatisch _Release und damit Free auf?

Es kommt also nur auf die drei Methoden (_Addref, _Release, QueryInterface) an?

Sehe ich das richtig?

THX
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Elvis

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

Re: Hab' ich das richtig verstanden mit DelphiCOM ?

  Alt 10. Sep 2007, 22:23
Ja, aber immer daran denken was dazu führt, dass es überhaupt zur Referenzzählung kommt.
Interfaceinstanzen sollten IMMER als const übergeben werden. Diese werden dann kein _AddRef oder Release bekommen.
Es ist also problemlos möglich eine Objektreferenz per const an eine Methode zu übergeben ohne dass dir die Instanz unterm Hintern weg gemopst wird.
Außerdem musst du aufpassen wenn du eine 2-seitige Beziehung zwischen 2 Interfaces hast.
Wenn nicht speziell implementiert würden sich beide Referenzen ewig am Leben halten.
Du solltest dir in so einem Fall eine Hierarchie ausdenken: Einer von beiden besitzt den anderen.
Der Owner kann weiterhin eine Referenz auf den anderen halten, währen der andere nur einen Pointer als Feld bekommt.
Du kannst weiterhin eine Property vom Typen des Owners haben, aber das Feld sollte nur ein Pointer sein.

Oh und zurück zur eigentlichen Frage: Damit QueryInterface (und damit Type casts) funktioniert sollten ALLE Interfaces eine GUID haben. (Ctrl + Shift + G)
Robert Giesecke
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#3

Re: Hab' ich das richtig verstanden mit DelphiCOM ?

  Alt 10. Sep 2007, 22:43
Danke für die ausführliche Antwort.

Ich wollte eigentlich nur mal das Zeugs nachahmen, was mit C++ selbstverstädlich ist: Stack basierende Objekte,
die nur im Gültigkeitsbereich existieren.
Das Rererencecountingzeugs kenne ich gut - darüber gab es schöne Klausuren mit fiesen Sachen.
Ich hoffe nur mal, dass mein Leakmanager solche Objekte auch findet. Muss ich mal testen.

Es geht eigentlich darum, dass man einen Thread solange personifzieren (engl. to impersonate) kann, wie der Gültigkeitsbereich lebt.

Delphi-Quellcode:
type TSecurityImpersonation = class(TInterfacedObject)...end;
var p : TSecurityImpersonation;
begin
  //
end;//p wird hier automatisch gelöscht.
Wie würde man am einfachsten hier das Objekt erzeugen, damit es nach end; automatisch gelöscht wird?
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Elvis

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

Re: Hab' ich das richtig verstanden mit DelphiCOM ?

  Alt 10. Sep 2007, 23:10
Dann schaue dir mal das hier im Anhang an:
Delphi-Quellcode:
var
  p : TSecurityImpersonation;
  sl : TSTringlist;
begin
  p := TSecuritonation.Create();
  AutoPointer.Wrap(p);
  sl := TStringList.Create();
  AutoPointer.Wrap(sl);
  // ...
end;//p wird hier automatisch gelöscht, sl auch
Wenn du allerdings ein ISecurityImpersonation hast (also en Interface mit den Methoden, die du brauchst), dann deklariere die lokale Variable einfach als da Interface und alles passiert von alleine.
Angehängte Dateien
Dateityp: pas uautopointer_101.pas (1,9 KB, 7x aufgerufen)
Robert Giesecke
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#5

Re: Hab' ich das richtig verstanden mit DelphiCOM ?

  Alt 10. Sep 2007, 23:34
Sowas in der Art habe ich mir gedacht.
Bis jetzt habe ich nur in C++ COM gemacht. Ich dachte eigentlich, das Delphi irgendwie abschottet und im Hintergrund macht, so dass man einfach .Create verwendet. Ich wollte die Klasse so einfach wie möglich verwendbar machen.
Kann man das ganze nicht auch ohne .Wrap machen, welches man gerne vergißt?

Ist das AutoPointer von dir?
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Elvis

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

Re: Hab' ich das richtig verstanden mit DelphiCOM ?

  Alt 10. Sep 2007, 23:45
Zitat von Dezipaitor:
Sowas in der Art habe ich mir gedacht.
Bis jetzt habe ich nur in C++ COM gemacht. Ich dachte eigentlich, das Delphi irgendwie abschottet und im Hintergrund macht, so dass man einfach .Create verwendet. Ich wollte die Klasse so einfach wie möglich verwendbar machen.
Glaube mir, du machst es NICHT einfacher, wenn du vom Standardweg der Umgebung zu sehr abweichst.
Wenn du ein Interface anbietest, das man dann als Typ der lokalen Variable nutzen kann, dann ist ziemlich eindeutig was passiert.
Du kannst natürlich auch nur eine Factory anbieten, so dass jeder außer dir nur das Interface benutzen kann.
Wenn ich "AutoPointer.Wrap(someInstance)" schreibe, dann sollte hoffentlich klar sein was passiert.
Zitat:
Kann man das ganze nicht auch ohne .Wrap machen, welches man gerne vergißt?
Nein, nicht ohne direkt ein Interface zu nutzen.
Zitat:
Ist das AutoPointer von dir?
Ja, aber ich glaube ich hatte ml was von jbg gesehen, was mich darauf brachte.
Robert Giesecke
  Mit Zitat antworten Zitat
Antwort Antwort


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 10:09 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