Вызов функций и интерфейсов оболочки из многопоточной квартиры

При вызове функции оболочки или интерфейсе оболочки или доступе к ней из потока, который был инициализирован как многопоточный объект, функция или интерфейс могут быть нарушены или полностью завершаются сбоем.

Исходная версия: Оболочка и интерфейс 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 при вызове из многопоточных квартир. Причина, как отмечалось выше, заключается в отсутствии сведений о типе или кода прокси-сервера или заглушки для запрашиваемых объектов.

Ссылки

Процесс, потоки и квартиры