INFO: Chamar funções de shell e interfaces de um multithreaded apartment

Traduções deste artigo Traduções deste artigo
ID do artigo: 287087 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Sumário

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

Mais Informações

Uma chamada para CoInitializeEx(COINIT_MULTITHREADED) permite chamadas para objetos criados no thread de chamada para ser executado em qualquer segmento. Ao acessar objetos que usam o apartment threading modelo a partir do multithreaded apartment, COM sincronizará acesso ao objeto. Para a sincronização ocorra, COM deve realizar marshaling chamadas para o objeto. Como o shell não fornece as informações necessárias no momento, através de uma biblioteca de tipos ou proxy/stub código, para seus objetos sejam empacotadas, tenta acessar objetos de shell a partir de uma falha de multithreaded apartment.

A seguir é exemplos de como chamadas para CoInitializeEx(COINIT_MULTITHREADED) podem afetar funções que dependem de objetos do shell:

GetOpenFileName/GetSaveFileName
Os usuários podem navegar para pastas de extensão de espaço para nome como "Meus documentos" pelas caixas de diálogo Abrir e Salvar como . No entanto, essas pastas não podem ser visitadas a porque o navegador não é possível criar as interfaces necessárias, como IShellFolder.
ShellExecute/ShellExecuteEx
Ganchos de ShellExecute podem ser escritos para estender a funcionalidade do ShellExecute/ShellExecuteEx Implementando a interface IShellExecuteHook. Quando ShellExecute/ShellExecuteEx é chamado, ganchos ShellExecute registrados não podem ser carregados.
Em ambos esses 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 erro E_NOINTERFACE quando chamado de compartimentos multithread. O motivo, como observado acima, é que não há nenhum código de proxy/stub ou informações de tipo para os objetos que está sendo solicitado.

Referências

"De processos, threads e apartments," em conceitos básicos de COM na documentação do Platform SDK:
http://msdn.microsoft.com/en-us/library/ms693344(VS.85).aspx

Propriedades

ID do artigo: 287087 - Última revisão: segunda-feira, 11 de julho de 2005 - Revisão: 1.4
A informação contida neste artigo aplica-se a:
  • Microsoft Platform Software Development Kit-January 2000 Edition
Palavras-chave: 
kbmt kbinfo kbpending kbshellgrp KB287087 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 287087

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com