Wywoływanie funkcji i interfejsów powłoki z wielowątkowego mieszkania
Gdy wywołujesz funkcję powłoki lub interfejs powłoki lub uzyskujesz do niego dostęp z wątku zainicjowanego jako apartament wielowątkowy, funkcja lub interfejs mogą mieć ograniczoną funkcjonalność lub całkowicie zakończyć się niepowodzeniem.
Oryginalna wersja: Powłoka systemu Windows i interfejs
Oryginalny numer KB: 287087
Przyczyna
Wywołanie metody CoInitializeEx (COINIT_MULTITHREADED)
umożliwia uruchamianie wywołań obiektów utworzonych w wątku wywołującego w dowolnym wątku. Podczas uzyskiwania dostępu do obiektów korzystających z modelu wątkowości mieszkania z wielowątkowego mieszkania com zsynchronizuje dostęp do obiektu. Aby ta synchronizacja miała miejsce, com musi zorganizować wywołania obiektu. Ponieważ powłoka obecnie nie dostarcza niezbędnych informacji za pośrednictwem biblioteki typów lub kodu serwera proxy/wycinka, aby jej obiekty były marshalowane, próby uzyskania dostępu do obiektów powłoki z wielowątkowego mieszkania nie powiodły się.
Wywołania, które mogą mieć wpływ na funkcje powłoki
Poniżej przedstawiono przykłady wpływu wywołań na CoInitializeEx (COINIT_MULTITHREADED)
funkcje, które polegają na obiektach powłoki:
GetOpenFileName/GetSaveFileName
Użytkownicy mogą przechodzić do folderów rozszerzeń przestrzeni nazw, takich jak Moje dokumenty , za pośrednictwem okna dialogowego Otwieranie i zapisywanie jako . Nie można jednak przeglądać tych folderów, ponieważ przeglądarka nie może utworzyć wymaganych interfejsów, takich jak
IShellFolder
.ShellExecute/ShellExecuteEx
ShellExecute
Haczyki mogą być zapisywane w celu rozszerzenia funkcjonalnościShellExecute
lubShellExecuteEx
przez zaimplementowanie interfejsuIShellExecuteHook
. PoShellExecute
wywołaniu lubShellExecuteEx
nie można załadować zarejestrowanychShellExecute
punktów zaczepienia.
W obu tych przykładach składnik, który próbuje uzyskać wskaźnik interfejsu do obiektu powłoki o CoCreateInstance
wartości , IUnknown::QueryInterface
i tak dalej, zwykle kończy się niepowodzeniem z powodu błędu E_NOINTERFACE
po wywołaniu z wielowątkowości apartamentów. Przyczyną, jak wspomniano powyżej, jest brak informacji o typie ani kodu serwera proxy/wycinka dla żądanych obiektów.
Informacje
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla