Announcement

Collapse
No announcement yet.

Fehler beim Versuch eine Callback Interface Methode aufzurufen.

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

  • Fehler beim Versuch eine Callback Interface Methode aufzurufen.

    Folgende Fehlermeldung tritt auf falls mein COM+ Server versucht eine Callback Interface Methode aufzurufen: 'Eine Schnittstelle, die für einen anderen Thread marshalled war, wurde von der Anwendung aufgerufen'. Das Callbacks wird asynchron durch ein Event einer externen Anwendung, welche durch meinen COM+ Server implementiert wird, ausgelöst. Wie kann man dieses verhalten abstellen? Kann ich das durch die Instantiierung oder das Threading-Modell abstellen?

  • #2
    Hallo,

    das ist ein komplexes Thema (in meinem Buch <i>COM/DCOM/COM+ mit Delphi</i> benötige ich 70 Seiten für das Thema <i>Marshaller und Apartments</i>).

    COM benötigt die Hilfe von Proxy-/Stub-Objekten, um Thread-übergreifend auf Objekte zugreifen zu können. Allerdings haben diese vom Betriebssystem automatisch eingeblendeten Hilfsobjekte nur in dem Thread (Übertragungsweg) Gültigkeit, von dem aus sie anfgefordert werden. Der Entwickler muss diese Details nur dann nicht beachten, wenn er einen der folgenden Wege nutzt: <br>
    a) CoCreateInstance fordert den Interface-Zeiger an<br>
    b) GIT (Global Interface Table) liefert den Interface-Zeiger<br>
    c) CoMarshalInterface bzw. CoMarshalInterThreadInterfaceInStream bereitet den Interface-Zeiger vor<br>
    d) Interface-Zeiger wird als Parameter beim Aufruf einer Interface-Methode übergeben

    Solange sich alle COM-Objektinstanzen und der Client im gleichen Prozess befinden, kann man durch geeignete Apartments (MTA und TNA) diese Einschränkungen aufbrechen. Wenn aber eine Prozess-Grenze (oder eine Rechner-Grenze) dazwischen liegt, ist immer der Marshaller beteiligt. Der Callback-Rückruf des Servers zum "Client" ist nur dann erfolgreich, wenn der Client den gültigen Interface-Zeiger auf seine eigene COM-Objektinstanz bereits beim Aufruf einer Interface-Methode des Servers als Parameter übergibt. Nur dann "kennt" der Server den Rückweg zum Client. In meinem Buch ist ein Beispiel für einen "Callback-Manager" zu finden, der mehrere Clients über diesen Rückkanal über bestimmte Ereignisse informieren kann

    Comment


    • #3
      Hallo Herr Kosch,

      genau diesen <I>Callback-Manager</I> haben wir implementiert. Der einzige Unterschied ist, dass wir den Interface-Zeiger beim Initialisieren übergeben, damit man auch Callbacks außerhalb des Aufrufs einer Interface-Methode auslösen kann. Wie soll ich vorgehen falls die Aufrufe der Interface-Methoden und die Callback-Rückrufe asynchron erfolgen sollen

      Comment

      Working...
      X