Frage

Ich habe einen IE BHO, die in C # in der Entwicklung ist. Es soll für den Benutzer warten, ein paar Sachen zu tun, unsere Server kontaktieren und einige Daten herunterzuladen und dann das DOM der aktuell geladenen Webseite mit den Ergebnissen verändern.

ich in einige scheinbar unüberwindlichen Problemen bin mit den Regeln von COM Kompartimentierung und Einfädeln in Bezug - nämlich ich nicht Zugang den IE DOMDocument außerhalb des aktuellen Threads scheinen kann, und ich kann von irgendeiner Weise nicht denken, etwas zu laufen asynchron ohne IE Perren, bis es fertig ist.

Mein erster Versuch war die Hintergrund-Server-Kommunikation Sachen in eine ereignisgesteuerten Art und Weise sein Ding: mein Programm würde initiieren Kommunikation innerhalb eines mshtml Ereignisses (BeforeNaviagate2 oder Document, zum Beispiel), und würde die Ergebnisse in einem Beitrag separater Event-Handler vom Server Kommunikationsobjekt ausgelöst, wenn es seine Arbeit beendet.

Das techniqued funktionierte gut in einem schnellen Simulator ich zusammengeschustert (nur eine einfache Anwendung mit einem WebBrowser-Steuerelement), aber in IE wäre es eine COM-Ausnahme werfen, weil ich versuche, Seite DOM durch einen separaten Thread zu verändern.

Also habe ich versucht, alles in der gleichen Funktion zu halten, und mein Code warten, für die Server-Kommunikationsobjekt seine Arbeit mit einer while-Schleife zu tun, wie folgt aus:


    int waited = 0;
    while (!OurServerCommRequest.ready) {
        System.Threading.Thread.Sleep(1);
        Application.DoEvents();
        waited++;

        if (waited > constants.TIMEOUT_OURSERVER_REQUEST) {
            log.wL("Timed out");
        }

    }

Das Problem bei diesem Ansatz ist, während der Code in dem ursprünglichen Thread bleibt, es synchroniously mit dem IE-Prozess führt sie gefeuert in (in IE8, es ist ein Prozess pro tab - wie Google Chrome - wie es scheint) ... daher Sperren der IE-Schnittstelle, bis meine Server-Kommunikation abgeschlossen ist.

Am Anfang wollte ich so schnell starten Verarbeitung als die URL (via NavigationComplete2 Ereignis) verfügbar war, aber ich entdecken, dass für den Warte Tag soll, bevor die Seite des Benutzers beende meine Server-Kommunikation verfügbar wird geladen auch IE einsperren würde -. es in eine Endlos-Schleife, während mein Code wartet auf den HTML-Körper zu werfen, während die Seite von der Aktualisierung selbst zu der oben genannten Schleife tun verhindert

Ich habe darüber nachgedacht, das alles in die eigentlichen Benutzer-Seite bewegt javascript aber es, dass dadurch scheint öffne ich mit XSS Sicherheitsfragen eine Dose Würmer bis in Gerangel.

Also ... meine Frage ist so: ist es möglich, Code asynchroniously in einem C # IE BHO zu laufen, während noch in der Lage des Benutzers Seite DOM zu manipulieren? Ich habe um ein paar Freunde gefragt, und die meisten Leute sagen mir, dass es nicht wahrscheinlich ist. Ich bin noch neu bei COM und C #, gekommen von C / VB.net / JS / AS.

Danke!

-Tom

War es hilfreich?

Lösung

Sie müssen das DOM-Objekt aus dem Thread Marschall es an Ihrem Worker-Thread erstellt wurde. Hier ist eine sehr detaillierte Aufschlüsselung, wie COM und C # zusammen spielen.

Alle der IE DOM-Objekte sind STA-Objekte.

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