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?
Announcement
Collapse
No announcement yet.
Fehler beim Versuch eine Callback Interface Methode aufzurufen.
Collapse
X
-
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
-
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
Comment