Dela via


Initiera COM-biblioteket

Alla Windows-program som använder COM måste initiera COM-biblioteket genom att anropa funktionen CoInitializeEx. Varje tråd som använder ett COM-gränssnitt måste göra ett separat anrop till den här funktionen. CoInitializeEx har följande signatur:

HRESULT CoInitializeEx(LPVOID pvReserved, DWORD dwCoInit);

Den första parametern är reserverad och måste vara NULL-. Den andra parametern anger den trådmodell som programmet ska använda. COM har stöd för två olika trådmodeller, lägenhetstrådade och flertrådade. Om du anger lägenhetstrådning gör du följande garantier:

  • Du kommer åt varje COM-objekt från en enda tråd. du delar inte COM-gränssnittspekare mellan flera trådar.
  • Tråden har en meddelandeloop. (Se fönstermeddelanden i Modul 1.)

Om något av dessa villkor inte är sant använder du den flertrådade modellen. Ange trådmodellen genom att ange någon av följande flaggor i parametern dwCoInit.

Flagga Beskrivning
COINIT_APARTMENTTHREADED Lägenhet med trådbunden anslutning.
COINIT_MULTITHREADED Flertådigt

 

Du måste ange exakt en av dessa flaggor. I allmänhet bör en tråd som skapar ett fönster använda flaggan COINIT_APARTMENTTHREADED och andra trådar bör använda COINIT_MULTITHREADED. Vissa COM-komponenter kräver dock en viss trådmodell.

Not

Faktiskt, även om du anger lägenhetstrådning, är det fortfarande möjligt att dela gränssnitt mellan trådar genom att använda en teknik som kallas marshalling. Hantering ligger utanför räckvidden för den här modulen. Det viktiga med lägenhetstrådning är att du aldrig får kopiera en gränssnittspekare till en annan tråd. Mer information om COM-trådmodeller finns att läsa i Processer, Trådar och Lägen.

 

Förutom de flaggor som redan nämnts är det en bra idé att ange flaggan COINIT_DISABLE_OLE1DDE i parametern dwCoInit. Om du anger den här flaggan undviks vissa omkostnader som är associerade med objektlänkning och inbäddning (OLE) 1.0, en föråldrad teknik.

Så här initierar du COM för lägenhetstrådning:

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

HRESULT returtypen innehåller en fel- eller framgångskod. Vi tittar på COM-felhantering i nästa avsnitt.

Uninitialisera COM-biblioteket

För varje lyckat anrop till CoInitializeExmåste du anropa CoUninitialize innan tråden avslutas. Den här funktionen tar inga parametrar och har inget returvärde.

CoUninitialize();

Nästa

felkoder i COM