ID do artigo: 206076 - Última revisão: quinta-feira, 22 de maio de 2008 - Revisão: 7.0

Como empacotar interfaces em compartimentos 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.
Observação Microsoft Visual C++ 2008, o Microsoft Visual C++ 2005, o Microsoft Visual C++ .NET 2003 e o Microsoft Visual C++ .NET 2002 oferecem suporte o modelo de código gerenciado que é fornecido pelo Microsoft .NET Framework e o modelo de código do Windows de Microsoft nativo não gerenciado. As informações neste artigo se aplicam somente ao código do Visual C++ não gerenciado.
Expandir tudo | Recolher tudo

Sumário

Marshal.exe é um exemplo que mostra as diferentes maneiras de empacotamento de uma interface em compartimentos.

Mais Informações

O seguinte arquivo está disponível para download no Centro de download da Microsoft:

Recolher 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 baixar os arquivos de suporte da Microsoft, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
119591  (http://support.microsoft.com/kb/119591/ ) Como obter arquivos de suporte da Microsoft de serviços on-line
Microsoft examinou esse arquivo em busca de vírus. Microsoft utilizou o mais recente software de detecção de vírus que estava disponível na data em que o arquivo foi publicado. O arquivo é armazenado em servidores com segurança avançada que ajudam a evitar qualquer alteração não autorizada no arquivo.

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

Se você criar um objeto COM em um STA thread, você não pode passar um ponteiro de interface para outro thread STA e chamada de saída nesse ponteiro. Como chamadas para objetos STA deveriam ser serializado, COM isso impõe permitindo somente um segmento para chamar o objeto STA (o segmento de onde ele foi criado). Se o ponteiro de interface que você passar para o segundo thread STA é um ponteiro para um proxy, você receberá um erro HRESULT de 0x8001010E ou RPC_E_WRONG_THREAD (o aplicativo chamou uma interface que foi empacotada para um thread diferente). Se o ponteiro de interface é um ponteiro direto para o objeto, COM não irá impor a serialização, você não obterá o erro acima e será feita a chamada de método de interface. No entanto, esse é comportamento ainda ilegal em parte do cliente.

Você ainda poderá chamar métodos no objeto STA de um thread STA diferente, desde que você fazer isso através de um proxy. Um proxy é uma cópia da interface que você obtém por meio de empacotamento/unmarshaling. Quando você faz uma chamada através do proxy, faz COM uma opção de thread e a chamada acaba de execução no contexto do segmento onde o objeto STA foi criado.

Há três maneiras de empacotamento/desempacotar uma interface para outro thread STA:
  1. CoMarshalInterThreadInterfaceInStream() e CoGetInterfaceAndReleaseStream() : uma desvantagem de usar esse método é a interface só pode ser desempacotada uma vez. Ou seja, se você precisar acessar ao mesmo objeto de vários segmentos do STA, esse método não funcionará.
  2. CoMarshalInterface() e CoUnMarshalInterface() : esse método é mais flexível, desde que você pode empacotar a interface de uma vez e desempacotar a interface quantas vezes forem você como, por exemplo, especificar MSHLFLGS_TABLEWEAK ou MSHLFLGS_TABLESTRONG quando a interface de empacotamento. Mas também requer mais código porque você precisará criar o IStream, definir o ponteiro de busca e limpar o pacote de empacotamento através de CoReleaseMarshalData(). Quando empacotamento ponteiros para um proxy você deve ter o Windows NT 4.0 Service Pack 4 ou posterior, Windows 98 ou Windows 95 com o DCOM 1.2 ou posterior instalado. Além disso quando usando o MSHLFLGS_TABLESTRONG sinalizar você deve ter o Windows 2000 ou posterior.
  3. Global Interface Table(GIT) : GIT O é um objeto COM que permite que você armazene uma interface em um thread STA e obter acesso ao proxy é em outro thread STA. Isso 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 que é o projeto principal. Contém um servidor ATL EXE que implementa ITest. ITest tem um método chamado ToUpper(), que converte uma seqüência de caracteres em maiúsculas. Um subprojeto chamado cliente também está incluído. Client.cpp é onde todos os métodos empacotamento/unmarshaling são mostrados. Cada método cria uma instância do objeto Test, empacota uma ITest interface e cria um thread. Em cada segmento, uma interface ITest é desempacotada e o método ToUpper() é chamado para converter uma seqüência de caracteres. Você verá a saída na janela de depuração de: "THIS IS OUTPUT FROM THREAD # N".

Referências

Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
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 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: 206076  (http://support.microsoft.com/kb/206076/en-us/ )