Einzelnen Beitrag anzeigen

tgoessi

Registriert seit: 31. Mai 2005
34 Beiträge
 
Delphi 5 Enterprise
 
#5

Re: ActiveX-COM-Server automatisch beenden

  Alt 6. Jun 2005, 14:10
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.
  Mit Zitat antworten Zitat