Question

Je suis en train d'écrire un Browser Helper Object (BHO) en C # qui manipule les DOM sur un thread séparé. Je l'ai vu plusieurs autres questions à ce sujet, et la réponse semble être « vous devez rassembler les objets DOM du fil, ils ont été créés sur votre thread de travail. » Un bon conseil, et il est parfaitement logique, mais je ne peux trouver aucun exemple C # sur la façon de le faire. Il y a quelques indications vagues à certaines API P / Invoke qui ont besoin d'être utilisé, mais je vais avoir du mal à voir comment mettre en œuvre cela dans un BHO.

J'apprends par l'exemple, et la documentation est lamentablement à des exemples .NET de ce genre de chose. point que quelqu'un peut me un exemple où, dans le cadre d'un code managé BHO, le DOM est manipulé par un thread de travail?

Était-ce utile?

La solution

Vous ne devriez pas avoir à effectuer une marshaling manuelle; les poignées d'exécution gérés tout objet COM intercloisonnement marshaling en votre nom.

Voici un exemple; cet échantillon géré BHO attend jusqu'à ce que l'événement se déclenche DocumentComplete et tourne un fil d'arrière-plan ThreadPool qui attend une seconde, puis change le titre de la page « Bonjour, StackOverflow! » et ajoute un nouveau nœud de texte avec un message spécial:

private void OnDocumentComplete(object frame, ref object urlObj)
{
    System.Threading.ThreadPool.QueueUserWorkItem((o) =>
    {
        System.Threading.Thread.Sleep(1000);
            HTMLDocument document = (HTMLDocument)this.browser.Document;
            document.title = "Hello, StackOverflow!";

            IHTMLDOMNode greetings = document.createTextNode("Hi there!");

            IHTMLDOMNode body = document.body as IHTMLDOMNode;
            body.insertBefore(greetings, body.firstChild);                
    }, this.browser);
}

#region IObjectWithSite Members

int IObjectWithSite.SetSite(object site)
{
    if (site != null)
    {
        this.browser = (WebBrowser)site;
        this.browser.DocumentComplete +=
         new DWebBrowserEvents2_DocumentCompleteEventHandler(
          this.OnDocumentComplete);
    }
    else
    {
        if (this.browser != null)
        {
            this.browser.DocumentComplete -=
             new DWebBrowserEvents2_DocumentCompleteEventHandler(
              this.OnDocumentComplete);
            this.browser = null;
        }
    }
    return 0;
}

int IObjectWithSite.GetSite(ref Guid guid, out IntPtr ppvSite)
{
    IntPtr punk = Marshal.GetIUnknownForObject(this.browser);
    int hr = Marshal.QueryInterface(punk, ref guid, out ppvSite);
    Marshal.Release(punk);

    return hr;
}

#endregion
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top