AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ActiveX-COM-Server automatisch beenden

Ein Thema von tgoessi · begonnen am 6. Jun 2005 · letzter Beitrag vom 6. Jun 2005
Antwort Antwort
tgoessi

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

ActiveX-COM-Server automatisch beenden

  Alt 6. Jun 2005, 08:59
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?

Dank für eure Hilfe
Tom
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: ActiveX-COM-Server automatisch beenden

  Alt 6. Jun 2005, 09:29
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...
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
tgoessi

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

Re: ActiveX-COM-Server automatisch beenden

  Alt 6. Jun 2005, 09:59
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 von Bernhard Geyer:
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...
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: ActiveX-COM-Server automatisch beenden

  Alt 6. Jun 2005, 10:14
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
tgoessi

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

Re: ActiveX-COM-Server automatisch beenden

  Alt 6. Jun 2005, 13: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
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 22:34 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