Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Qualquer programa do Windows que use COM deve inicializar a biblioteca COM chamando a funçãoCoInitializeEx. Cada thread que usa uma interface COM deve fazer uma chamada separada para essa função. CoInitializeEx tem a seguinte assinatura:
HRESULT CoInitializeEx(LPVOID pvReserved, DWORD dwCoInit);
O primeiro parâmetro é reservado e deve ser NULL. O segundo parâmetro especifica o modelo de threading que o programa usará. COM suporta dois modelos de threading diferentes: threading de apartamento e multithreading. Se especificar fios de apartamento, está a fazer as seguintes garantias:
- Você acessará cada objeto COM a partir de um único thread; você não compartilhará ponteiros de interface COM entre vários threads.
- O thread terá um loop de mensagens. (Consulte Mensagens da Janela no Módulo 1.)
Se qualquer uma dessas restrições não for verdadeira, use o modelo multithreaded. Para especificar o modelo de threading, defina um dos seguintes sinalizadores no parâmetro dwCoInit.
| Bandeira | Descrição |
|---|---|
| COINIT_APARTMENTTHREADED | Apartamento roscado. |
| COINIT_MULTITHREADED | Multithreaded. |
Você deve definir exatamente uma dessas bandeiras. Geralmente, um thread que cria uma janela deve usar o sinalizador COINIT_APARTMENTTHREADED e outros threads devem usar COINIT_MULTITHREADED. No entanto, alguns componentes COM requerem um modelo de threading específico.
Observação
Na verdade, mesmo que você especifique o threading de apartamento, ainda é possível compartilhar interfaces entre threads, usando uma técnica chamada marshaling. Marshaling está além do escopo deste módulo. O ponto importante é que, com o threading de apartamento, você nunca deve simplesmente copiar um ponteiro de interface para outro thread. Para obter mais informações sobre os modelos de threading COM, consulte Processos, threads e apartamentos.
Além das bandeiras já mencionadas, é uma boa ideia definir a bandeira COINIT_DISABLE_OLE1DDE no parâmetro dwCoInit. Definir esse sinalizador evita alguma sobrecarga associada ao OLE (Object Linking and Embedding) 1.0, uma tecnologia obsoleta.
Aqui está como você inicializaria o COM para encadeamento de apartamento:
HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
O tipo de retorno HRESULT inclui um código de sucesso ou de erro. Veremos o tratamento de erros COM na próxima seção.
Desinicializando a biblioteca COM
Para cada chamada bem-sucedida para CoInitializeEx, você deve chamar CoUninitialize antes que o thread saia. Esta função não usa parâmetros e não tem valor de retorno.
CoUninitialize();
Seguinte