Inicialização da biblioteca COM

Qualquer programa do Windows que usa COM deve inicializar a biblioteca COM chamando a função CoInitializeEx. 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 seu programa usará. O COM dá suporte a dois modelos de threading diferentes, apartment threaded e multithreaded. Se você especificar o apartment threading estará fazendo as seguintes garantias:

  • Você acessará cada objeto COM de um único thread e você não compartilhará ponteiros de interface COM entre vários threads.
  • O thread terá um loop de mensagem. (Veja Mensagens de 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 sinalizadores a seguir no parâmetro dwCoInit.

Sinalizador Descrição
COINIT_APARTMENTTHREADED Apartment threaded.
COINIT_MULTITHREADED Multithreaded.

 

Você deve definir exatamente um desses sinalizadores. 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 exigem um modelo de threading específico.

Observação

Na verdade, mesmo que você especifique o apartment threading, ainda é possível compartilhar interfaces entre threads, usando uma técnica chamada marshaling. O Marshaling está além do escopo deste módulo. O ponto importante é que, com o apartment threading, 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 Apartments).

 

Além dos sinalizadores já mencionados, é uma boa ideia definir o sinalizador COINIT_DISABLE_OLE1DDE no parâmetro dwCoInit. Definir esse sinalizador evita sobrecarga associada ao OLE (Banco de dados de vinculação e incorporação de objeto) 1.0, uma tecnologia obsoleta.

Veja como você inicializaria o COM para apartment threading:

HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);

O tipo de retorno HRESULT contém um código de erro ou êxito. Veremos o tratamento de erros COM na próxima seção.

Cancelando a inicialização da biblioteca COM

Para cada chamada bem-sucedida para CoInitializeEx, você deve chamar CoUninitialize antes que a thread encerre. Essa função não recebe parâmetros e não tem valor de retorno.

CoUninitialize();

Próximo

Códigos de erro em COM