Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Wenn Sie eine Shellfunktion oder Shellschnittstelle von einem Thread aufrufen oder darauf zugreifen, der als Multithread-Apartment initialisiert wurde, kann die Funktion oder Schnittstelle ihre Funktionalität beeinträchtigen oder vollständig fehlschlagen.
Originalfassung: Windows-Shell und -Schnittstelle
Ursprüngliche KB-Nummer: 287087
Ursache
Durch einen Aufruf CoInitializeEx (COINIT_MULTITHREADED)
können Aufrufe von Objekten, die im aufrufenden Thread erstellt wurden, auf jedem Thread ausgeführt werden. Beim Zugriff auf Objekte, die das Apartment-Threadingmodell aus einem Multithread-Apartment verwenden, synchronisiert COM den Zugriff auf das Objekt. Damit diese Synchronisierung auftritt, muss COM Aufrufe an das Objekt marshallen. Da die Shell derzeit nicht die erforderlichen Informationen bereitstellt, entweder über eine Typbibliothek oder durch Proxy-/Stubcode, um ihre Objekte zu marshalen, ist der Zugriff auf Shellobjekte aus einem Multithread-Apartmentmodell nicht möglich.
Aufrufe, die sich auf Shellfunktionen auswirken können
Im Folgenden finden Sie Beispiele dafür, wie sich Aufrufe CoInitializeEx (COINIT_MULTITHREADED)
auf Funktionen auswirken können, die auf Shellobjekten basieren:
GetOpenFileName/GetSaveFileName
Benutzer können über das Dialogfeld "Öffnen" und "Speichern unter" zu Namespaceerweiterungsordnern wie "Eigene Dokumente" navigieren. Diese Ordner können jedoch vom Browser nicht durchsucht werden, da der Browser nicht die erforderlichen Schnittstellen erstellen kann, z.B.
IShellFolder
.ShellExecute/ShellExecuteEx
ShellExecute
Hooks können geschrieben werden, um die Funktionalität vonShellExecute
oderShellExecuteEx
durch Implementierung derIShellExecuteHook
Schnittstelle zu erweitern. WennShellExecute
oderShellExecuteEx
aufgerufen wird, können registrierteShellExecute
Hooks nicht geladen werden.
In beiden Beispielen wird die Komponente, die versucht, mit CoCreateInstance
, IUnknown::QueryInterface
und so weiter einen Schnittstellenzeiger auf ein Shell-Objekt zu erhalten, typischerweise von einem Fehler E_NOINTERFACE
begleitet, wenn sie von Multithread-Apartments aufgerufen wird. Der Grund, wie oben erwähnt, ist, dass keine Typinformationen oder Proxy-/Stubcode für die angeforderten Objekte vorhanden sind.