Поделиться через


Инициализация COM-библиотеки

Любая программа Windows, использующая COM, должна инициализировать библиотеку COM, вызвав функцию CoInitializeEx . Каждый поток, использующий COM-интерфейс, должен выполнять отдельный вызов этой функции. CoInitializeEx имеет следующую подпись:

HRESULT CoInitializeEx(LPVOID pvReserved, DWORD dwCoInit);

Первый параметр зарезервирован и должен иметь значение NULL. Второй параметр указывает модель потоковой передачи, которую будет использовать ваша программа. COM поддерживает две различные модели потоков, многопоточные и многопоточные. Если указать потоки квартир, вы делаете следующие гарантии:

  • Вы получите доступ к каждому COM-объекту из одного потока; Вы не будете совместно использовать указатели интерфейса COM между несколькими потоками.
  • Поток будет иметь цикл сообщений. (См. раздел Сообщения окна в модуле 1.)

Если одно из этих ограничений не имеет значения true, используйте многопототочную модель. Чтобы указать модель потоков, задайте один из следующих флагов в параметре dwCoInit .

Флаг Description
COINIT_APARTMENTTHREADED Потоки квартиры.
COINIT_MULTITHREADED Многопоточных.

 

Необходимо задать именно один из этих флагов. Как правило, поток, создающий окно, должен использовать флаг COINIT_APARTMENTTHREADED , а другие потоки должны использовать COINIT_MULTITHREADED. Однако для некоторых компонентов COM требуется определенная модель потоков.

Примечание.

На самом деле, даже если указать потоки квартиры, можно по-прежнему совместно использовать интерфейсы между потоками, используя метод маршалинг. Маршалинг выходит за рамки этого модуля. Важно отметить, что при использовании потоков квартиры никогда не следует просто копировать указатель интерфейса на другой поток. Дополнительные сведения о моделях потоков COM см. в разделе "Процессы", "Потоки" и "Квартиры".

 

Помимо уже упомянутых флагов, рекомендуется задать флаг COINIT_DISABLE_OLE1DDE в параметре dwCoInit . Установка этого флага позволяет избежать некоторых накладных расходов, связанных с связыванием объектов и внедрением (OLE) 1.0, устаревшей технологией.

Вот как инициализировать COM для потоков квартиры:

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

Тип возвращаемого значения HRESULT содержит код ошибки или успешности. Мы рассмотрим обработку ошибок COM в следующем разделе.

Неинициализация библиотеки COM

Для каждого успешного вызова CoInitializeEx необходимо вызвать CoUninitialize перед выходом потока. Эта функция не принимает параметров и не имеет возвращаемого значения.

CoUninitialize();

Следующий

Коды ошибок в COM