Chamando funções e interfaces do shell de um apartamento multithread

Quando você chama ou acessa uma função shell ou interface shell de um thread que foi inicializado como um apartamento multithread, a função ou interface pode ter sua funcionalidade prejudicada ou falha completamente.

Versão original: Shell e Interface do Windows
Número de KB original: 287087

Motivo

Uma chamada para CoInitializeEx (COINIT_MULTITHREADED) permitir chamadas para objetos criados no thread de chamada a serem executados em qualquer thread. Ao acessar objetos que usam o modelo de threading de apartamento de um apartamento multithread, o COM sincronizará o acesso ao objeto. Para que essa sincronização ocorra, a COM deve enviar chamadas para o objeto. Como o shell atualmente não fornece as informações necessárias, seja por meio de uma biblioteca de tipos ou código proxy/stub, para que seus objetos sejam empacotados, as tentativas de acessar objetos shell de um apartamento multithread falham.

Chamadas que podem afetar funções de shell

Veja a seguir exemplos de como as chamadas podem CoInitializeEx (COINIT_MULTITHREADED) afetar funções que dependem de objetos shell:

  • GetOpenFileName/GetSaveFileName

    Os usuários podem navegar até pastas de extensão de namespace, como Meus Documentos , por meio da caixa de diálogo Abrir e Salvar Como . No entanto, essas pastas não podem ser navegadas porque o navegador não pode criar as interfaces necessárias, como IShellFolder.

  • ShellExecute/ShellExecuteEx

    ShellExecute os ganchos podem ser gravados para estender a funcionalidade de ShellExecute ou ShellExecuteEx implementando a IShellExecuteHook interface. Quando ShellExecute ou ShellExecuteEx é chamado, os ganchos registrados ShellExecute não podem ser carregados.

Em ambos os exemplos, o componente que está tentando obter um ponteiro de interface para um objeto shell com CoCreateInstance, IUnknown::QueryInterfacee assim por diante, normalmente falhará com o erro E_NOINTERFACE quando chamado de apartamentos multithreaded. O motivo, conforme observado acima, é que não há informações de tipo ou código proxy/stub para os objetos que estão sendo solicitados.

Referências

Processar, Threads e Apartamentos