Инициализация библиотеки 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();
Следующая
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по