Udostępnij przez


Inicjowanie biblioteki COM

Każdy program systemu Windows używający modelu COM musi zainicjować bibliotekę COM przez wywołanie funkcji CoInitializeEx. Każdy wątek korzystający z interfejsu COM musi wykonać osobne wywołanie tej funkcji. CoInitializeEx ma następujący podpis:

HRESULT CoInitializeEx(LPVOID pvReserved, DWORD dwCoInit);

Pierwszy parametr jest zarezerwowany i musi być wartość NULL. Drugi parametr określa model zarządzania wątkami, który będzie używany przez program. COM obsługuje dwa różne modele wątkowości: jednowątkowy i wielowątkowy. W przypadku określania wątków apartamentowych dokonujesz następujących gwarancji:

  • Uzyskasz dostęp do każdego obiektu COM z jednego wątku; wskaźniki interfejsu COM nie będą udostępniane między wieloma wątkami.
  • Wątek będzie miał pętlę komunikatu. (Zobacz komunikaty okna w module 1).

Jeśli którykolwiek z tych ograniczeń nie jest spełniony, użyj modelu wielowątkowego. Aby określić model wątkowości, ustaw jedną z następujących flag w parametrze dwCoInit.

Flaga Opis
COINIT_APARTMENTTHREADED Mieszkanie złożone.
COINIT_MULTITHREADED Wielowątkowy.

 

Należy ustawić dokładnie jedną z tych flag. Ogólnie rzecz biorąc, wątek tworzący okno powinien używać flagi COINIT_APARTMENTTHREADED, a inne wątki powinny używać COINIT_MULTITHREADED. Jednak niektóre komponenty COM wymagają określonego modelu wątkowania.

Notatka

W rzeczywistości, nawet jeśli określisz wątki apartamentowe, nadal istnieje możliwość udostępniania interfejsów między wątkami przy użyciu techniki nazywanej marshaling. Marshaling wykracza poza zakres tego modułu. Ważnym punktem jest to, że w przypadku wątków mieszkalnych nigdy nie trzeba po prostu kopiować wskaźnika interfejsu do innego wątku. Aby uzyskać więcej informacji na temat modeli wątków COM, zobacz Procesy, Wątki i Apartamenty.

 

Oprócz już wymienionych flag warto ustawić flagę COINIT_DISABLE_OLE1DDE w parametrze dwCoInit. Ustawienie tej flagi pozwala uniknąć pewnych obciążeń związanych z łączeniem obiektów i osadzaniem (OLE) 1.0, przestarzałą technologią.

Oto jak zainicjować COM dla wątków mieszkalnych:

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

Typ zwracany HRESULT zawiera kod błędu lub powodzenia. W następnej sekcji przyjrzymy się obsłudze błędów COM.

Wyłączanie biblioteki COM

Dla każdego pomyślnego wywołania CoInitializeEx, należy wywołać CoUninitialize, zanim wątek się zakończy. Ta funkcja nie przyjmuje żadnych parametrów i nie ma wartości zwracanej.

CoUninitialize();

Następny

kody błędów w COM