Exemplo ATL de chamada (empacotamento) de interfaces COM threaded de apartamento de um thread de trabalho

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

Pergunta

Estou procurando um exemplo de código que ilustra como fazer chamadas COM cross-threaded em uma DLL de servidor ATL COM. Conhece um?

Mais detalhes:

Meu componente é um objeto auxiliar do navegador IE que precisa funcionar em um thread de segundo plano. Em um dos métodos do meu objeto chamado do thread principal do IE, o IE me dá um ponteiro para o DOM do IE ( IHtmlWindow2 ) e eu o armazeno em uma variável de membro local.

Agora, quero criar um thread de trabalho que possa chamar métodos de forma assíncrona nesse ponteiro de interface COM que acabei de armazenar.

Se for importante, minhas chamadas acontecerão depois que eu retornar do método onde obtive o ponteiro da interface do IE, então o IE (e não meu código) terá controle quando eu tentar fazer as chamadas do meu thread de trabalho.

Tanto meu componente quanto o aplicativo host são encadeados pelo Apartment.

Alguém conhece um bom exemplo de C ++ mostrando como isso é feito?

Estou procurando especificamente por uma amostra curta e direta (e não apenas uma indicação de documentação relevante) porque li esta questão e suas respostas e fiquei intimidado com a quantidade de aprendizado que eu teria que fazer para escrever uma implementação do zero. Sempre que alguém recomenda ler um livro Don Box antes de escrever o código, você sabe que terá uma noite longa e confusa ... :-)

Foi útil?

Solução

Isso é automático em COM, cuida dos requisitos de apartamento e empacota a chamada se o ponteiro da interface tiver afinidade STA.Você precisa empacotar o ponteiro de interface antes de usá-lo no thread, ATL tem os métodos auxiliares AtlMarshalPtrInProc () e AtlUnmarshalPtr () para facilitar.CoMarshalInterThreadInterfaceInStream () ou IGlobalInterfaceTable se você quiser fazer isso sozinho.

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