Partilhar via


Inicializando a biblioteca COM

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

Códigos de erro em COM