Condividi tramite


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

Codici di errore in COM