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
IShellFolder
esempio .ShellExecute/ShellExecuteEx
ShellExecute
gli hook possono essere scritti per estendere la funzionalità diShellExecute
oShellExecuteEx
implementando l'interfacciaIShellExecuteHook
. QuandoShellExecute
viene chiamato oShellExecuteEx
, gli hook registratiShellExecute
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::QueryInterface
e 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
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per