Artigo: 206076 - Última revisão: quinta-feira, 22 de Maio de 2008 - Revisão: 7.0

Como organizar interfaces em apartments no Visual C++

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Nota Microsoft Visual C++ 2008, o Microsoft Visual C++ 2005, Microsoft Visual C++ .NET 2003 e Microsoft Visual C++ .NET 2002 suportam o modelo de código gerido que é fornecido pelo Microsoft .NET Framework e o modelo de código do Microsoft Windows nativo não gerido. As informações neste artigo aplicam-se apenas ao código de Visual C++ não gerido.
Expandir tudo | Reduzir tudo

Sumário

Marshal.exe é um exemplo que mostra as diferentes formas de empacotamento de referências uma interface entre apartments.

Mais Informação

O ficheiro seguinte está disponível para transferência a partir do Centro de transferências da Microsoft:

Reduzir esta imagemExpandir esta imagem
Download
Download the Marshal.exe package now. (http://download.microsoft.com/download/vc60pro/info2/1/win98/en-us/marshal.exe)

Para obter mais informações sobre como transferir ficheiros de suporte da Microsoft, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
119591  (http://support.microsoft.com/kb/119591/ ) Como obter ficheiros de suporte da Microsoft a partir de serviços online
Microsoft procedeu de vírus neste ficheiro. Microsoft utilizou o mais recente software de detecção de vírus que estava disponível na data em que o ficheiro foi publicado. O ficheiro é alojado em servidores com segurança avançada o que ajuda a impedir alterações não autorizadas ao ficheiro.

Um Single-Threaded Apartment (STA) é um thread foi inicializado com CoInitialize() ou CoInitializeEx (NULL, COINIT_APARTMENTTHREADED). Além disso, outros threads no mesmo processo que utilizam COM também devem chamar CoInitialize() ou CoInitializeEx() para inicializar o COM para o thread.

Se criar um objecto COM em um STA thread, não é possível passar um apontador de interface para outro thread STA e chamada fora dessa ponteiro. Uma vez que supostamente tem que ser serializado o chamadas para objectos STA, COM impõe esta permitindo apenas um thread de chamadas para o objecto STA (o thread onde foi criado). Se o apontador de interface que passar para o segundo thread STA um apontador para um proxy, obterá um erro HRESULT de 0x8001010E ou RPC_E_WRONG_THREAD (a aplicação chamou uma interface que foi empacotar as referências para um thread diferente). Se o apontador de interface é um apontador directo para o objecto, COM não irá impor a serialização, não obterá o erro acima e será efectuada a chamada de método de interface. No entanto, este é comportamento ainda ilegal em parte do cliente.

Pode ainda chamar métodos no objecto STA de thread STA diferente desde fazê-lo através de um proxy. Um proxy é uma cópia da interface que obterá através de empacotamento de referências de unmarshaling. Quando efectuar uma chamada através do proxy, faz COM um parâmetro de thread e a chamada termina execução no contexto do thread onde foi criado o objecto STA.

Existem três formas de empacotamento/desempacotar uma interface para outro thread STA:
  1. CoMarshalInterThreadInterfaceInStream() e CoGetInterfaceAndReleaseStream() : uma desvantagem de utilizar este método é a interface só pode ser unmarshaled uma vez. Isto é, se tiver acesso ao mesmo objecto a partir de vários threads STA, este método não funciona.
  2. CoMarshalInterface() e CoUnMarshalInterface() : Este método é mais flexível uma vez que pode organizar a interface de uma vez e desempacotar a interface tantas vezes quantas as gosta; por exemplo, especificar MSHLFLGS_TABLEWEAK ou MSHLFLGS_TABLESTRONG quando empacotamento de referências a interface. Mas também requer código mais uma vez que terá de criar o IStream, definir o ponteiro de procura e limpar o pacote de empacotamento de referências através de CoReleaseMarshalData(). Quando apontadores para um proxy de autenticação é necessário o Windows NT 4.0 Service Pack 4 ou posterior, Windows 98 ou Windows 95 com DCOM 1.2 ou posterior instalado. Também quando utilizar o MSHLFLGS_TABLESTRONG sinalizar tem de ter o Windows 2000 ou posterior.
  3. Table(GIT) Interface Global : O GIT é um objecto COM que permite-lhe armazenar uma interface num thread STA e obter acesso a seu proxy no outro thread STA. Esta opção só está disponível com o Windows NT 4.0 Service Pack 3 ou posterior, Windows 98 ou Windows 95 com o DCOM 1.1 ou posterior instalado.
Marshal.exe contém TSTMARSH incluído no projecto principal. Contém um servidor ATL EXE que implementa ITest. ITest tem um método chamado ToUpper() converte uma cadeia para maiúsculas. Também incluído um subprojecto designado por cliente. Client.cpp é onde são mostrados todos os métodos de autenticação de unmarshaling. Cada método cria uma instância do objecto de teste, marshals um ITest interface e cria um thread. Cada tópico, uma interface ITest é unmarshaled e o método ToUpper() é chamado para converter uma cadeia. Deverá ver o resultado na janela de depuração de: "Esta É a saída de THREAD # N".

Referências

Para obter mais informações, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
172314  (http://support.microsoft.com/kb/172314/ ) EXPLICAÇÃO do erro RPC_E_WRONG_THREAD

A informação contida neste artigo aplica-se a:
  • Microsoft Visual C++ 2008 Express Edition
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
Palavras-chave: 
kbmt kbsweptvs2008 kbarchitecture kbfile kbhowto kbsample kbthread KB206076 KbMtpt
Tradução automáticaTraduçã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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 206076  (http://support.microsoft.com/kb/206076/en-us/ )