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


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

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

HRESULT CoInitializeEx(LPVOID pvReserved, DWORD dwCoInit);

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

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

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

Флаг Описание
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