![]() |
ActiveX-COM-Server automatisch beenden
Hallo
Wenn ich einen ActiveX-COM-Server schliessen möchte, erhalte ich immer die Meldung 'Es sind noch COM-Objekte aktiv, wollen Sie wirklich beenden', obwohl ich alle Programme, die auf das Interface zugreifen geschlossen habe. :? Muss ich im Destroy des TAutoObjects noch einen Befehl angeben, damit das COM-Objekt wirklich beendet wird oder wie kann man das machen, dass sich der ActiveX-Server automatisch beendet, wenn das Programme, welches auf den ActiveX-Server zugreift beendet wird? :gruebel: Dank für eure Hilfe Tom |
Re: ActiveX-COM-Server automatisch beenden
Dann ist bei der Referenzzählung eine Fehler passiert.
Diese Meldung kommt nur dann wenn der COM-Server aufgrund der Referenzzählung davon ausgeht das noch ein Programm das Interface verwendet. Wenn dein Client Delphi-Programme sind, so gibt es nur einen bekannten Fall in dem die Automatische Referenzzählung von Delphi fehlschlägt. Bei C++-Clients sind Fehler in der Referenzzählung eher der Normalfall. Wenn Du etwas Client-Code posten köntest... |
Re: ActiveX-COM-Server automatisch beenden
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?
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin DispControl := CoDispControl.Create; end; procedure TForm1.Btn1ProcessClick(Sender: TObject); begin DispControl.InitCounter(10); <do sth> DispControl.SetMode(2); end; Zitat:
|
Re: ActiveX-COM-Server automatisch beenden
Zitat:
Du kann es aber früher freigeben, in dem Du die Variable auf nil setzt. |
Re: ActiveX-COM-Server automatisch beenden
Ich habe den Fehler gefunden. In der Destroy-Routine fehlte das Inherited. :wink:
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:
TDispenserData ist das Objekt, IDispenserData ist die externe AvticeX-Schnittstelle, IDispenserTriggerEvents ist eine interne private Schnittstelle, über die die Meldungen des Servers gesendet werden.
procedure TDispenserData.Initialize;
begin if not assigned (DispenserInterfaces) then DispenserInterfaces := TInterfaceList.Create; DispenserInterfaces.Add(self as IDispenserTriggerEvents); inc(IntfCount); end; IntfCount ist ein interner Zähler, welche die Interfaces zählt. In der Destroy-Routine steht dann:
Delphi-Quellcode:
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. :|
procedure TDispenserData.Destroy;
begin DispenserInterfaces.Remove(self as IDispenserTriggerEvents); dec(IntfCount); if IntfCount = 0 then DispenserInterfaces.Free; end; 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:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:48 Uhr. |
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 by Thomas Breitkreuz