Вызов функций и интерфейсов оболочки из многопоточной квартиры
При вызове функции оболочки или интерфейсе оболочки или доступе к ней из потока, который был инициализирован как многопоточный объект, функция или интерфейс могут быть нарушены или полностью завершаются сбоем.
Исходная версия: Оболочка и интерфейс Windows
Исходный номер базы знаний: 287087
Причина
Вызов позволяет CoInitializeEx (COINIT_MULTITHREADED)
выполнять вызовы объектов, созданных в вызывающем потоке, в любом потоке. При доступе к объектам, которые используют модель потоков квартиры из многопоточной квартиры, COM синхронизирует доступ к объекту. Чтобы выполнить такую синхронизацию, COM должна маршалировать вызовы объекта . Так как оболочка в настоящее время не предоставляет необходимые сведения с помощью библиотеки типов или кода прокси-сервера или заглушки для маршалирования своих объектов, попытки получить доступ к объектам оболочки из многопоточной квартиры завершаются ошибкой.
Вызовы, которые могут влиять на функции оболочки
Ниже приведены примеры того, как вызовы могут влиять CoInitializeEx (COINIT_MULTITHREADED)
на функции, использующие объекты оболочки.
GetOpenFileName/GetSaveFileName
Пользователи могут переходить к папкам расширения пространства имен, таким как Мои документы , с помощью диалогового окна Открытие и сохранение как . Однако эти папки не удается просмотреть, так как браузер не может создать необходимые интерфейсы, например
IShellFolder
.ShellExecute/ShellExecuteEx
ShellExecute
Перехватчики могут быть записаны для расширения функциональностиShellExecute
илиShellExecuteEx
путем реализацииIShellExecuteHook
интерфейса. ПриShellExecute
вызове илиShellExecuteEx
зарегистрированныеShellExecute
перехватчики не могут быть загружены.
В обоих этих примерах компонент, который пытается получить указатель интерфейса на объект оболочки с CoCreateInstance
, IUnknown::QueryInterface
и т. д., обычно завершается ошибкой E_NOINTERFACE
при вызове из многопоточных квартир. Причина, как отмечалось выше, заключается в отсутствии сведений о типе или кода прокси-сервера или заглушки для запрашиваемых объектов.
Ссылки
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по