Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Любая программа 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();
Следующий