Я создал расширение контекстного меню File Explorer, которое использует интерфейс IExplorerCommand для добавления команд меню в контекстное меню Windows 11.
Это работало нормально, но после последнего обновления Windows перестало работать должным образом.
Хотя команды меню по-прежнему появляются, ничего не происходит, когда я нажимаю на любую из них. Я добавил ведение журнала и вижу, что IExplorerCommand::Invoke() больше не вызывается.
Как ни странно, если я выбираю меню «Показать дополнительные параметры», чтобы получить устаревшее контекстное меню Windows 10, команды из этого меню работают нормально, только в новом контекстном меню Windows 11 они не работают.
Я попытался запустить File Explorer в отладчике при выборе команд меню, и я получаю такие строки в окне вывода, когда я нажимаю на команду:
onecore\com\combase\dcomrem\stdid.cxx(726)\combase.dll!00007FF9EB9947F5: (вызывающий: 00007FF9C22E1E38) ReturnHr(2627) tid(67bc) 8001010E Приложение вызвало интерфейс, который был маршалирован для другого потока.
Я предполагаю, что это причина, по которой мои команды не вызываются. Есть ли у кого-нибудь предложения о том, что вызывает это? Может ли это быть ошибкой в проводнике?
Я пробовал модели потоковой передачи STA и MTA, и их изменение не имело значения.
@simon Да, он упакован с личностью. Как я уже сказал, меню появляются, просто когда я нажимаю на них, ничего не происходит. Кроме того, этот код работал раньше, сейчас он просто перестал работать. Я понимаю, что на это будет сложно ответить, я надеялся, что у кого-то могут быть какие-то предложения о том, что может быть не так с COM-объектом, если он вызывает ошибку «интерфейс, который был упорядочен для другого потока».
Предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.





Что ж, после потраченных часов на это у меня наконец-то есть решение!
Мой код был основан на примере кода PhotoStoreContextMenu: https://github.com/microsoft/AppModelSamples/tree/master/Samples/SparsePackages/PhotoStoreContextMenu
Это использует библиотеку шаблонов C++ среды выполнения Windows (WRL) и определяет базовые классы, используемые классом, следующим образом:
class TestExplorerCommandBase : public RuntimeClass<RuntimeClassFlags<ClassicCom>, IExplorerCommand, IObjectWithSite>
Изменение, которое исправило это для моего кода, заключалось в использовании WinRtClassicComMix вместо ClassicCom, т.е.
class TestExplorerCommandBase : public RuntimeClass<RuntimeClassFlags<WinRtClassicComMix >, IExplorerCommand, IObjectWithSite>
Я почти уверен, что эта проблема началась, когда я установил KB5019509, обновление Windows, которое изменяет проводник, чтобы теперь в нем были вкладки.
Упаковали ли вы свое приложение с идентификацией (blogs.windows.com/windowsdeveloper/2021/07/19/… )? Пробовали ли вы официальные образцы Microsoft github.com/microsoft/AppModelSamples/tree/master/Samples/… и github.com/microsoft/Windows-classic-samples/tree/main/Samplees/…? Трудно помочь без воспроизводимого кода.