Chiamata di funzioni e interfacce della shell da un apartment multithreading

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

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

Causa

Una chiamata a consente l'esecuzione CoInitializeEx (COINIT_MULTITHREADED) di chiamate a oggetti creati nel thread chiamante in qualsiasi thread. Quando si accede a oggetti che usano il modello di threading apartment da un apartment a thread multipli, COM sincronizza l'accesso all'oggetto. Affinché questa sincronizzazione venga eseguita, COM deve effettuare 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, per il marshalling dei relativi oggetti, i tentativi di accesso agli oggetti shell da un apartment multithreading hanno esito negativo.

Chiamate che possono influire sulle funzioni della shell

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

  • GetOpenFileName/GetSaveFileName

    Gli utenti possono passare alle cartelle delle estensioni dello spazio dei nomi, ad esempio Documenti personali, tramite la finestra di dialogo Apri e Salva con nome . Tuttavia, queste cartelle non possono essere sfogliate perché il browser non può creare le interfacce necessarie, ad IShellFolderesempio .

  • ShellExecute/ShellExecuteEx

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

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

Riferimenti

Processo, thread e appartamenti