Ich habe den Fehler gefunden. In der Destroy-Routine fehlte das Inherited.
Nun hab ich aber noch ein weiteres Problem:
In meinem Server muss ich eine Meldung an alle erzeugten Interfaces senden. Dazu erzeugte ich eine Interfaceliste, in welches jedes gestartete Interface sich einträgt:
Delphi-Quellcode:
procedure TDispenserData.Initialize;
begin
if not assigned (DispenserInterfaces) then
DispenserInterfaces := TInterfaceList.Create;
DispenserInterfaces.Add(self as IDispenserTriggerEvents);
inc(IntfCount);
end;
TDispenserData ist das Objekt, IDispenserData ist die externe AvticeX-Schnittstelle, IDispenserTriggerEvents ist eine interne private Schnittstelle, über die die Meldungen des Servers gesendet werden.
IntfCount ist ein interner Zähler, welche die Interfaces zählt.
In der Destroy-Routine steht dann:
Delphi-Quellcode:
procedure TDispenserData.Destroy;
begin
DispenserInterfaces.Remove(self
as IDispenserTriggerEvents);
dec(IntfCount);
if IntfCount = 0
then
DispenserInterfaces.Free;
end;
Nun hab ich das Problem, dass mein Referenzzähler beim Speichern in der Interfaceliste auf 3 ansteigt. Beim Disconnect des Interfaces wird daher die Destroy-Routine nicht aufgerufen.
Wie kann ich dieses Problem lösen oder kann ich aus der Applikation heraus eine Interfaceliste erhalten, ohne eine eigene Interfaceliste erzeugen zu müssen?
Tom
Zitat von
Bernhard Geyer:
Zitat von
tgoessi:
Ich kann das DispControll nur mit Create allozieren.
Destroy gibt es nicht.
_Release soll man gem. Help nicht verwenden.
Wird das Form geschlossen, wird wohl auch das Interface geschlossen oder etwa nicht. Wie wird das Objekt dereferenziert?
Da der Referenzzähler eine Member deines Formulares ist (hoffe doch nicht das du es als globale Variable verwendest) wird es freigeben sobald das Formular freigegeben wird.
Du kann es aber früher freigeben, in dem Du die Variable auf nil setzt.