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

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

HRESULT CoInitializeEx(LPVOID pvReserved, DWORD dwCoInit);

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

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

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

Flag Описание
COINIT_APARTMENTTHREADED Квартира резьбой.
COINIT_MULTITHREADED Многопоточных.

 

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

Примечание

На самом деле, даже если вы укажете потоки, все равно можно совместно использовать интерфейсы между потоками, используя метод , называемый маршалингом. Маршалирование выходит за рамки область этого модуля. Важный момент заключается в том, что при использовании потоков квартиры никогда не нужно просто копировать указатель интерфейса на другой поток. Дополнительные сведения о моделях потоков 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