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ści ShellExecute lub ShellExecuteEx przez zaimplementowanie interfejsu IShellExecuteHook . Po ShellExecute wywołaniu lub ShellExecuteEx nie można załadować zarejestrowanych ShellExecute punktów zaczepienia.

W obu tych przykładach składnik, który próbuje uzyskać wskaźnik interfejsu do obiektu powłoki o CoCreateInstancewartości , IUnknown::QueryInterfacei 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

Proces, wątki i apartamenty