Pergunta

Eu tenho um BHO IE que está em desenvolvimento em C #. Supõe-se que esperar para o usuário a fazer algumas coisas, contacte o nosso servidor e baixar alguns dados, e, em seguida, alterar o DOM da página web atualmente carregado com os resultados.

Eu estou correndo em alguns problemas aparentemente insuperáveis ??relativas às regras de COM compartimentalização e rosqueamento - ou seja, eu não consigo acesso a parte externa IE DOMDocument do segmento atual e eu não consigo pensar em alguma maneira de executar algo de forma assíncrona, sem trancar ou seja, até que esteja terminado.

Minha primeira tentativa tinha o servidor de comunicação de material de fundo fazer a sua coisa de uma forma orientada a eventos: meu programa iria iniciar comunicações de dentro de um evento mshtml (BeforeNaviagate2 ou DocumentComplete, por exemplo), e iria publicar os resultados de dentro de um manipulador de eventos separado acionado pelo objeto de comunicação servidor quando ele terminou o seu trabalho.

Isso techniqued funcionou bem em um simulador rápido eu remendada (apenas um aplicativo simples com um controle WebBrowser), mas no IE seria lançar uma exceção COM porque eu estava tentando página DOM alter através de um segmento separado.

Então, eu tentei manter tudo na mesma função, e ter minha espera código para o servidor de comunicações opor-se a fazer o seu trabalho com um loop while, como este:


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

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

    }

O problema com esta abordagem é, enquanto as estadias de código no segmento original, ele executa synchroniously com o processo de IE-lo demitido em (no IE8, é um processo por guia - como o Google Chrome - ao que parece) ... portanto, trancando a interface IE até que completa a minha Communications server.

Inicialmente eu queria iniciar o processamento assim que a URL estava disponível (via evento NavigationComplete2), mas eu descobri que espera para o marca para se tornar disponível deve minhas comunicações do servidor terminar antes página do usuário carregado também trancar IE -. jogá-lo em um loop infinito enquanto meus esperas de código para o corpo HTML, enquanto a página está impedido de se atualizando fazer para o loop acima mencionada

Já pensou em mover tudo isso em página javascript do usuário real, mas parece que ao fazê-lo eu estou abrindo uma lata de vermes em disputas com as questões de segurança XSS.

Então ... minha pergunta é tal: é possível executar código asynchroniously em um C # IE BHO enquanto ainda está sendo capaz de manipular o DOM página do usuário? Eu perguntei por aí alguns amigos e a maioria das pessoas me dizem que não é provável. Eu ainda sou novo no COM e C #, tendo vindo de C / VB.net / JS / AS.

Obrigado!

-Tom

Foi útil?

Solução

Você precisa organizar o objeto DOM a partir do thread que foi criado para o seu segmento de trabalho. Aqui é uma discriminação muito detalhada de como COM e C # jogo juntos.

Todos os objetos IE DOM são STA objetos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top