Announcement

Collapse
No announcement yet.

COM-Server mehrfach laden

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • COM-Server mehrfach laden

    Hallo,
    Ich habe ein Automatisierungs-Objekt in einer ActiveX-Library mit Events
    erstellt. Die so entstandene DLL wird von verschiedenen Clients genutzt.
    Geschrieben in VB,BC++,AgilentVEE und eben Delphi. Es gibt nun Clients, die
    dieses Objekt mehrfach laden wollen. Das laden macht auch kein Problem, nur
    wenn ich dann eine Instanz des Objekts zerstöre, funktioniert nichts mehr.
    Ich bin in der COM-Programierung kein Spezialist und könnte einen Rat
    brauchen. Leider kann ich dieses "mehrfach laden" nicht unterbinden und
    wäre für einen Lösungsansatz dankbar. Ich habe ein Testprogramm in Delphi
    geschrieben, um dieses Problem zu testen. Leider mit dem gleichen Ergebnis.

    Danke im Voraus
    Andreas

  • #2
    Hallo,

    was bedeutet "<i>nur wenn ich dann eine Instanz des Objekts zerstöre</i>" im Detail? Sowohl die Aufgabe des Erzeugens der Objektinstanz als auch das automatische Abräumen beim Freigeben des letzten Interface-Zeigers des letzten Clienst sollte man ausschließlich dem COM-Subsystem von Windows überlassen.

    Comment


    • #3
      Hallo,
      Erstmal Danke für Ihre Antwort. Ich hoffe, meine Ausdrucksweise ist verständlich.
      Für mich bedeutet es, daß ich eine Methode meines Servers aufrufe, in der ich einen Thread anhalte und freigebe sowie reservierten Speicher freigebe. Desweiteren setze ich in meiner Client-Anwendung die entsprechende Variable, die auf meinen Server zeigt, auf "nil".

      Gruß
      Andrea

      Comment


      • #4
        Hallo,

        &gt;..in der ich einen Thread anhalte und freigebe sowie reservierten Speicher freigebe.

        so etwas ist generell von Übel, und im Fall von COM ein dreister Frevel :-)

        Wie sieht so etwas im Sourcecode aus? Warum muss ein Thread angehalten werden - das Freigeben des <b>Interface-Zeigers</b> reicht doch bereits aus, um eine nicht mehr in Gebrauch befindliche Objektinstanz automatisch abräumen zu lassen

        Comment


        • #5
          Hallo Herr Kosch,

          Ich habe mal versucht, einige, wichtige Teile meines Sourcecodes darzustellen:

          Ich habe in meinem COM-Server eine Variable "FtRecordThread" für den Thread deklariert. Ich benutze die Thread-Klasse aus dem Win32-Buch, Seite 344.

          <PRE>
          TGdcDriver = class(TAutoObject, IConnectionPointContainer, IGdcDriver)
          private
          { Private-Deklarationen }
          FConnectionPoints: TConnectionPoints;
          FConnectionPoint: TConnectionPoint;
          FSinkList: TList;
          FEvents: IGdcDriverEvents;
          FtRecordThread: TOsInstantThread;

          FBuffer: PByteArray;

          </PRE>

          In der "Initialize-Prozedure" meines COM-Servers erzeuge ich den Thread mit:

          <PRE>
          FtRecordThread := InstantThread(ThrdFct, nil);
          </PRE>

          In der Prozedur "ThrdFct" werden vom USB-Port 64 Byte's geholt, bewertet und in einen Puffer(FBuffer) kopiert. Die Puffergröße kann vom Anwender über eine Methode bestimmt werden und wird dann mit "GetMem(FBuffer, FiBufferSize)" erzeugt.
          Wenn ich nun meine Client-Anwendung verlasse, rufe ich eine Methode "DrvFree" des COM-Servers auf, die u.a. folgende Zeilen enthält:

          <PRE>
          FtRecordThread.StopThread;
          FtRecordThread := nil;

          FreeMem(FBuffer);
          FBuffer := nil;
          </PRE>

          Ich mußte extra eine Methode "DrvFree" erstellen, weil der Destruktor von meinem COM-Server, der vorher obige Zeilen enthielt, in Agilent-VEE nicht durchlaufen wird. In Delphi, C-Builder und VB war das kein Problem.

          Den Thread mußte ich anhalten, weil vieleicht gerade beim Verlassen der Anwendung, die Daten vom USB-Port in einer do-while-Schleife umkopiert werden. Dies führte dann zu einer Meldung von Delphi, daß zu viele Exceptions aufgetreten waren und es erschien das CPU-Fenster.
          Werden keine Daten bearbeitet, aber der Thread ist aktiv, bekomme ich auch keine Fehlermeldung.

          Ich hoffe, daß ich das wesentliche aufgeführt habe.
          Danke für Ihre Hilfe

          Comment

          Working...
          X