我有一个IE BHO这是在发展中C#。它应该等待用户做一些东西,请联系我们的服务器,并下载一些数据,然后改变当前加载的网页页面的DOM的结果。

我遇到了有关COM条块和线程的规则一些看似不可逾越的问题 - 即,我似乎访问不能在IE之外的DOM文档当前线程的,我想不出任何办法来运行的东西异步无直到它完成锁住IE。

我第一次尝试了后台服务器通信的东西做的事情以事件驱动的方式:我的程序会从MSHTML事件中启动通信(BeforeNaviagate2或一个DocumentComplete,例如),并会从内后的结果单独的事件处理程序由服务器通信对象发射时,它完成其工作。

这techniqued在快速模拟器我拼凑起来的(只是一个简单的应用程序使用WebBrowser控件)工作的罚款,但在IE中会抛出一个COM异常,因为我试图通过一个单独的线程来改变页面的DOM。

所以我试图保持在同一个函数的一切,并有我的代码等待服务器通信对象做其工作,while循环,如下所示:


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

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

    }

这种方法的问题是在代码停留在原来的线程,它与IE进程就打响了synchroniously执行(以IE8,它的每一个标签的过程 - 就像谷歌浏览器 - 它似乎)...因此锁定了IE接口我的服务器的通信完成为止。

首先,我想尽快开始的URL可用(通过NavigationComplete2事件)的处理,但是我发现,等待标签变得可用应该在用户的页面之前,我的服务器通信完成加载也将锁定IE - 投掷它进入无限循环而我的代码等待HTML体,而从更新本身做上述环路防止页

我已经想过这个移动所有到实际用户的页面的JavaScript但似乎这样做,我与XSS安全问题的争论开辟了一罐蠕虫。

所以...我的问题是这样的:是否有可能在C#IE BHO asynchroniously运行的代码,同时仍然能够操纵用户的页面的DOM?我问过身边的一些朋友,大多数人告诉我,这是不可能的。我还是新在COM和C#,具有来自C / VB.net / JS / AS

谢谢!

- 汤姆

有帮助吗?

解决方案

您需要编组从它到您的工作线程创建的线程进行的DOM对象。 这里是一个非常详细的击穿如何COM和C#一起玩。

所有IE DOM对象的是STA对象。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top