Inizializzazione della libreria COM
Qualsiasi programma Windows che utilizza COM deve inizializzare la libreria COM chiamando la funzione CoInitializeEx. Ogni thread che usa un'interfaccia COM deve effettuare una chiamata separata a questa funzione. CoInitializeEx ha la firma seguente:
HRESULT CoInitializeEx(LPVOID pvReserved, DWORD dwCoInit);
Il primo parametro è riservato e deve essere NULL. Il secondo parametro specifica il modello di threading che verrà usato dal programma. COM supporta due diversi modelli di threading, threading apartment e multithreading. Se si specifica il threading apartment, si effettuano le garanzie seguenti:
- Si accederà a ogni oggetto COM da un singolo thread; non verranno condivisi puntatori di interfaccia COM tra più thread.
- Il thread avrà un ciclo di messaggi. (Vedere Messaggi finestra nel modulo 1.
Se uno di questi vincoli non è true, usare il modello multithreading. Per specificare il modello di threading, impostare uno dei flag seguenti nel parametro dwCoInit .
Flag | Descrizione |
---|---|
COINIT_APARTMENTTHREADED | Apartment threaded. |
COINIT_MULTITHREADED | Multithreading. |
È necessario impostare esattamente uno di questi flag. In genere, un thread che crea una finestra deve usare il flag COINIT_APARTMENTTHREADED e altri thread devono usare COINIT_MULTITHREADED. Tuttavia, alcuni componenti COM richiedono un modello di threading specifico.
Nota
In realtà, anche se si specifica il threading apartment, è comunque possibile condividere le interfacce tra thread, usando una tecnica denominata marshalling. Il marshalling non rientra nell'ambito di questo modulo. Il punto importante è che con il threading apartment, non è mai necessario copiare semplicemente un puntatore di interfaccia a un altro thread. Per altre informazioni sui modelli di threading COM, vedere Processi, thread e appartamenti.
Oltre ai flag già menzionati, è consigliabile impostare il flag COINIT_DISABLE_OLE1DDE nel parametro dwCoInit . L'impostazione di questo flag evita un sovraccarico associato al collegamento di oggetti e all'incorporamento (OLE) 1.0, una tecnologia obsoleta.
Ecco come inizializzare COM per il threading apartment:
HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
Il tipo restituito HRESULT contiene un codice di errore o di esito positivo. Nella sezione successiva verrà esaminata la gestione degli errori COM.
Annullamento dell'inizializzazione della libreria COM
Per ogni chiamata riuscita a CoInitializeEx, è necessario chiamare CoUninitialize prima che il thread venga chiuso. Questa funzione non accetta parametri e non ha alcun valore restituito.
CoUninitialize();
Avanti