Freigeben über


Aufrufen von Shell-Funktionen und Schnittstellen aus einem Multithreaded-Apartment

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 von ShellExecute oder ShellExecuteEx durch Implementierung der IShellExecuteHook Schnittstelle zu erweitern. Wenn ShellExecute oder ShellExecuteEx aufgerufen wird, können registrierte ShellExecute 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.

Verweise

Prozess, Threads und Wohnungen