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 deShellExecute
ouShellExecuteEx
implementando aIShellExecuteHook
interface. QuandoShellExecute
ouShellExecuteEx
é chamado, os ganchos registradosShellExecute
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::QueryInterface
e 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
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários