Announcement

Collapse
No announcement yet.

Aufruf eines OLE-Objektes aus einem Thread

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

  • Aufruf eines OLE-Objektes aus einem Thread

    Hallo,

    ich erzeuge beim Anzeigen eines Formulares mit
    baanID:=CreateOLEObject('Baan4.Application');
    ein OLE-Objekt.

    Auf dieses kann ich auch problemlos zugreifen. Allerdings werden auch noch zwei Threads erzeugt und aus diesen soll ebenfalls auf das Objekt zugegriffen werden. Leider erhalten ich hier immer die Fehlermeldung:
    "Eine Schnittstelle, die für einen anderen Thread marshalled war, wurde von der Anwendung aufgerufen".

    Der Zugriff auf das Objekt sieht folgendermaßen aus.
    baanID.ParseExecFunction(BaanDll,BaanDllFunction);

    Vielleicht hat ja jemand eine Idee!

    Tausend Dank schon mal im Voraus

    Viele Grüße

    Christoph

  • #2
    Hallo,

    COM-Server und ihrer Clients können zwischen zwei grundlegenden Apartment-Modellen wählen, wobei das Vermischen von mehreren Modellen in einem Prozeß zulässig ist:

    1. Single-threaded Apartment (<b>STA</b>, alias Apartment Model): In einem Prozeß greift ein Thread oder mehrere Threads auf COM zu, wobei COM die Aufrufe synchronisiert. Die Interface-Zeiger müssen vor der Übergabe in andere Threads vom Marshaler bearbeitet werden.

    2. Multi-threaded Apartment (<b>MTA</b>, alias Free Model): In einem Prozeß greift ein Thread oder mehrere Threads auf COM zu, wobei ohne Beteiligung des Marshaler und ohne eine Synchronisation direkt auf die Objekte zugegriffen wird.

    Die Fehlermeldung: "<i>Eine Schnittstelle, die für einen anderen Thread marshalled war, wurde von der Anwendung aufgerufen</i>" erscheint immer dann als Veto, wenn ein STA-Objekt von einem anderen Thread heraus ohne vorherige Vorbereitung aufgerufen wird. Wenn zwei Threads des gleichen Prozesses auf ein STA-Objekt gemeinsam zugreifen wollen, muss der Interface-Zeiger für den "fremden" Thread zuerst über <b>CoMarshalInterThreadInterfaceInStream</b> vorbereitet und dann im zweiten Thread über <b>CoGetInterfaceAndReleaseStream</b> abgeholt werden. Alternativ dazu steht auch der Weg über <b>CoMarshalInterface</b>/ <b>CoUnmarshalInterface</b> beziehungsweise über die Running Object Table (ROT) zur Verfügung.

    In meinem Buch <i>COM/DCOM/COM+ mit Delphi</i> geht das Kapitel 4 (70 Seiten) auf dieses Thema ein

    Comment

    Working...
    X