COM:Der Aufruf von einem anderen Thread führt zu Abstürzen. Wie kann ich dafür sorgen, dass er im selben Thread ausgeführt wird?

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

  •  11-07-2019
  •  | 
  •  

Frage

Ich mache ein BHO (Erweiterung für IE), das Ereignisse in anderen Threads empfängt.Wenn ich von diesem anderen Thread aus auf das DOM zugreife, stürzt der IE ab.Ist es möglich, den Zugriff auf das DOM über denselben Thread wie den Haupt-BHO-Thread zu ermöglichen, damit es nicht abstürzt?

Es scheint ein allgemeines COM-Multithreading-Problem zu sein, das ich nicht besonders verstehe.

War es hilfreich?

Lösung

Schauen Sie in mit CoMarshalInterface oder CoMarshalInterThreadInterfaceInStream

Diese geben Ihnen einen umhüllten Schnittstelle zu einem STA-COM-Objekt, das sicher ist, fädelt.

Andere Tipps

Ich weiß nicht viel über IE-Erweiterungen, aber es klingt wie einig COM-Objekt eine Single Threaded Apartments werden muss markiert, so dass das COM-Laufzeitsystem stellt sicher, dass es auf dem gleichen Thread ausgeführt wird, die es ursprünglich genannt. Wenn Sie nicht auf das andere Objekt verändern können, könnten Sie wahrscheinlich Ihre Anrufe auf das DOM über ein separates COM-Objekt als STA markiert, um die gleiche Wirkung zu erzielen. Hoffe, das hilft ... ich ein wenig über COM Multithreading kennen, aber nicht viel über IE-Erweiterungen.

ah, fun fun fun Multithreading mit COM.

Gerald Antwort richtig, wenn Sie genau einmal auf einen anderen übertragen möchten einen Schnittstellenzeiger von einem Thread aussieht. Ich habe festgestellt, dass die GIT (globale Schnittstellentabelle) für diese Art der Sache eine große Hilfe ist, wenn Sie in einem Multi-Thread-System sind ... im Grunde Sie halten nicht um Schnittstellenzeiger, sondern DWORD vom GIT verwendet Cookies erhalten eine entsprechend-gemarshallte Schnittstellenzeiger für was auch immer Thread Sie es verwenden. (Sie haben die in Frage stehende Objekt mit dem GIT sich registrieren und deregistrieren es später, wenn Sie fertig sind oder das Objekt fertig ist)

Seien Sie jedoch vorsichtig.Leistung kann zu einem ernsten Problem werden.

Wenn Sie nur herumspielen, um etwas über BHOs ​​zu lernen, können Sie die STA verwenden, um Ihr ::SetSite()-Implementierungsobjekt so zu betreiben, als wäre es ein Single-Thread (dies ermöglicht Ihnen, dass andere Threads den Zeiger Ihres BHO aus der GlobalInterfaceTable ziehen). wie @JasonS erwähnt.

Wenn Sie etwas tun, von dem erwartet wird, dass es Teil eines Produkts ist, empfehle ich Ihnen dringend, den Einsatz von MTA überall dort, wo Sie können, noch einmal sorgfältig zu überdenken und die Probleme mit der Parallelität und Thread-Sicherheit selbst zu lösen.In diesem Fall müssten Sie nur sicherstellen, dass die Threads, die mit Ihrem BHO-COM-Objekt zusammenarbeiten, selbst für COM initialisiert wurden.

Wenn Sie beispielsweise eingehende/ausgehende Daten einer Website auf Dinge (entweder gefährliche oder sensible) überwachen möchten, dann möchten Sie NICHT alle diese Threads in den Rachen eines STA-Objekts zwingen, weil, am Beispiel von Yahoo, Es werden mehr als 30 Anfragen gestartet und Ihr BHO beginnt, den IE zu blockieren.

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