ATL-Beispiel für das Aufrufen (Marshalling) von COM-Schnittstellen mit Apartment-Thread von einem Worker-Thread

StackOverflow https://stackoverflow.com/questions/5411927

Frage

Ich suche nach einem Codebeispiel, das veranschaulicht, dass Cross-Thread-COM-Aufrufe in einer ATL COM Server-DLL ausgeführt werden. Kennen Sie eine?

Weitere Details:

Meine Komponente ist ein IE-Browser-Hilfsobjekt, das an einem Hintergrundthread arbeiten muss. In einer der Methoden meines Objekts, die vom Hauptthread des IE aufgerufen werden, gibt mir der IE einen Zeiger auf das IE-DOM ( IHtmlWindow2 ) und ich speichere es in einer lokalen Mitgliedsvariablen.

Jetzt möchte ich einen Arbeitsthread erstellen, der asynchron Methoden für den gerade gespeicherten COM-Schnittstellenzeiger aufrufen kann.

Wenn es darauf ankommt, werden meine Aufrufe ausgeführt, nachdem ich von der Methode zurückgekehrt bin, bei der ich den Schnittstellenzeiger vom IE erhalten habe, sodass der IE (und nicht mein Code) die Kontrolle hat, wenn ich versuche, die Anrufe von meinem Arbeitsthread aus zu tätigen.

Sowohl meine Komponente als auch die Host-Anwendung haben ein Apartment-Thread.

Kennt jemand ein gutes C ++ - Beispiel, das zeigt, wie das gemacht wird?

Ich suche speziell nach einem kurzen, einfachen Beispiel (und nicht nur nach einem Zeiger auf relevante Dokumentation), weil ich Diese Frage und ihre Antworten und wurde eingeschüchtert über die Menge an Lernen, die ich tun musste eine Implementierung von Grund auf neu schreiben. Jedes Mal, wenn jemand empfiehlt, ein Don Box-Buch zu lesen, bevor er Code schreibt, wissen Sie, dass Sie in einer langen, verwirrenden Nacht sind ... :-)

War es hilfreich?

Lösung

Das ist in COM automatisch, es kümmert sich um die Wohnungsanforderungen und leitet den Anruf, wenn der Schnittstellenzeiger eine STA-Affinität aufweist.Sie müssen den Schnittstellenzeiger marshallen, bevor Sie ihn im Thread verwenden können. ATL verfügt über die Hilfsmethoden AtlMarshalPtrInProc () und AtlUnmarshalPtr (), um dies zu vereinfachen.CoMarshalInterThreadInterfaceInStream () oder IGlobalInterfaceTable, wenn Sie es selbst tun möchten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top