Condividi tramite


Chiamare le funzioni e le interfacce della shell da un appartamento multithreaded

Quando si chiama o si accede a una funzione shell o a un'interfaccia della shell da un thread inizializzato come apartment multithreading, la funzione o l'interfaccia potrebbe avere problemi di funzionalità o completamente non riuscite.

Versione originale: Shell e interfaccia di Windows
Numero KB originale: 287087

Motivo

Una chiamata a CoInitializeEx (COINIT_MULTITHREADED) consente di chiamare gli oggetti creati nel thread chiamante da eseguire in qualsiasi thread. Quando si accede agli oggetti che utilizzano il modello di threading ad appartamento da un appartamento multithread, COM sincronizzerà l'accesso all'oggetto. Affinché questa sincronizzazione avvenga, COM deve fare il marshalling delle chiamate all'oggetto. Poiché la shell attualmente non fornisce le informazioni necessarie, tramite una libreria dei tipi o un codice proxy/stub, affinché i relativi oggetti vengano sottoposti a marshalling, i tentativi di accesso agli oggetti della shell da un apartment multithreading hanno esito negativo.

Chiamate in grado di influenzare le funzioni della shell

Di seguito sono riportati esempi di come le chiamate a CoInitializeEx (COINIT_MULTITHREADED) possono influire sulle funzioni che si basano sugli oggetti della shell:

  • GetOpenFileName/GetSaveFileName

    Gli utenti possono accedere alle cartelle di estensione dello spazio dei nomi, come I miei documenti, utilizzando la finestra di dialogo Apri e Salva con nome. Tuttavia, queste cartelle non possono essere esaminate perché il browser non può creare le interfacce necessarie, ad esempio IShellFolder.

  • ShellExecute/ShellExecuteEx

    ShellExecute Gli hook possono essere scritti per estendere la funzionalità di ShellExecute o ShellExecuteEx implementando l'interfaccia IShellExecuteHook . Quando vengono chiamati ShellExecute o ShellExecuteEx, gli hook registrati ShellExecute non possono essere caricati.

In entrambi questi esempi, il componente che tenta di ottenere un puntatore di interfaccia a un oggetto shell con CoCreateInstance, IUnknown::QueryInterface e così via, tipicamente fallirà con errore E_NOINTERFACE quando viene chiamato da appartamenti multithread. Il motivo, come indicato in precedenza, è che non sono presenti informazioni sul tipo o codice proxy/stub per gli oggetti richiesti.

Riferimenti

Processi, Thread e Appartamenti