COM: chamando de outro segmento provoca falhas, como fazê-lo funcionar no mesmo segmento?

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

  •  11-07-2019
  •  | 
  •  

Pergunta

Eu estou fazendo um BHO (extensão para o IE), que recebe eventos em outro segmento. Quando eu acesso o DOM do que outro segmento, IE falha. É possível fazer o DOM acessado a partir do mesmo segmento como o segmento principal BHO para que ele não falhar?

Parece que um problema COM geral multithreading, que eu não entendo muito.

Foi útil?

Solução

olhar em usar CoMarshalInterface ou CoMarshalInterThreadInterfaceInStream

Eles darão uma interface envolto a um objeto STA COM que é thread-safe.

Outras dicas

Eu não sei muito sobre extensões do IE, mas parece que algum objeto COM tem de ser marcado um Single Threaded Apartment, de modo que os garante sistema COM tempo de execução que é executado no mesmo segmento que o chamou inicialmente. Se você não pode alterar a outro objeto, você provavelmente poderia encaminhar suas chamadas para o DOM através de um objeto COM separado marcado como STA para conseguir o mesmo efeito. Espero que isso ajude ... Eu sei um pouco sobre COM multithreading, mas não muito sobre extensões do IE.

ah, fun fun fun multithreading com COM.

resposta de Gerald parece certo se você deseja transferir um ponteiro de interface de um segmento para outro exatamente uma vez. Descobri que o GIT (tabela de interface global) é uma grande ajuda para este tipo de coisa se você estiver em um sistema multithread ... basicamente você não manter em torno de interface ponteiros, mas biscoitos em vez DWORD utilizados pelo GIT para obter um ponteiro de interface apropriadamente empacotado por qualquer segmento que você estiver usando. (Você tem que registrar o objeto em questão com o GIT primeiro, e cancelar o registro mais tarde, quando você é feito ou o seu objeto está terminada)

Tenha cuidado, porém. Desempenho pode se tornar um problema sério.

Se você está apenas brincando de aprender sobre BHOs, você pode usar o STA para tornar a sua :: SetSite () implementação de objeto operar como se fosse único segmento (isto permite que você deixe outros tópicos puxar o ponteiro do BHO para fora do GlobalInterfaceTable como @JasonS menciona.

Se você está fazendo algo que é esperado para ser parte de um produto eu recomendo que você cuidadosamente reconsiderar MTA indo em todos os lugares que você puder e lidar com a concorrência e questões de segurança segmento de si mesmo. Neste caso, você só precisa garantir que os tópicos inter-operar com o seu objecto BHO COM, eram eles mesmos, inicializado para COM.

Por exemplo, se você quiser monitorar os dados de entrada / saída de website à procura de coisas (quer perigosas ou sensíveis) - então você não quer forçar todos esses tópicos baixo a garganta de um objeto STA, porque, usando o Yahoo como Por exemplo, mais de 30 pedidos será iniciado e seu BHO vai começar a trancar-se IE.

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