Как получить/итерировать элементы контекстного меню Win11 IExplorerCommand?

Около пяти лет назад я написал программу для клиента, которая эффективно воссоздавала контекстное меню Windows Explorer внутри программы — если они щелкали объект, представляющий их файл данных, показывалось контекстное меню, которое они видели в проводнике, включая элементы меню общего доступа Dropbox. (Механизм аналогичен приведенному здесь: https://github.com/linquize/explorerplus-custom/blob/master/Explorer%2B%2B/Helper/ContextMenuManager.cpp — поиск всех COM-объектов IContextMenu из реестра. и запрашивая каждый термин, чтобы добавить свои пункты меню.)

Всё это время это работало нормально... но Windows 11 всё изменила, а новая версия клиента Dropbox (v159) нарушила обратную совместимость.

Подводя итог, можно сказать, что COM-объекты IContextMenu в старом стиле можно было запрашивать в разделе HKEY_CLASSES_ROOT*\shellex\ContextMenuHandlers (или в аналогичных местах), но новое краткое контекстное меню в Win11 вместо этого использует объекты IExplorerCommand. Проводник включает их в контекстное меню старого стиля, а также в итерации IContextMenu — в случае с Dropbox это привело к ошибке, из-за которой пункты меню дублировались. Кажется, они только что исправили это в v159, отключив элементы IContextMenu... это означает, что они больше не отображаются в моем меню.

Итак, как мне найти и перебрать все объекты IExplorerCommand, добавленные в новое контекстное меню краткой формы? Включая команды облачных провайдеров из таких приложений, как Dropbox?

Что бы это ни стоило, я могу найти идентификаторы классов для элементов Dropbox в их AppxManifest.xml:

             <Extensions>
            <desktop3:Extension Category="windows.cloudFiles">
                <desktop3:CloudFiles>
                    <desktop3:CloudFilesContextMenus>
                      <desktop3:Verb Id="Dropbox01UpgradeCommand"
                                     Clsid="F3BC3DAF-431B-4F0E-B105-E9BB76335840" />
                      <desktop3:Verb Id="Dropbox02ShareCommand"
                                     Clsid="7F4C5B83-2680-40AF-9AE9-2161AA759EF2" />

И он также определяет COM-сервер, на котором они работают:

                  <com:Extension Category="windows.comServer">
                <com:ComServer>
                    <com:SurrogateServer AppId="67233DFC-D70F-4D8E-A068-6877D86826BC"
                                         DisplayName="ms-resource:ShellExtensionServerDisplayName">
                        <com:Class Id="7F4C5B83-2680-40AF-9AE9-2161AA759EF2"
                                   Path="DropboxExt64.55.0.dll" ThreadingModel="STA" />
                        <com:Class Id="F3BC3DAF-431B-4F0E-B105-E9BB76335840"
                                   Path="DropboxExt64.55.0.dll" ThreadingModel="STA" />

И эти записи видны в разделе HKEY_CLASSES_ROOT\PackagedCom, например:

[HKEY_CLASSES_ROOT\PackagedCom\Package\DropboxInc.Dropbox_159.4.5870.0_x86__wkt425jdc3sga\Server\0][HKEY_CLASSES_ROOT\PackagedCom\Package\DropboxInc.Dropbox_159.4.5870.0_x86__wkt425jdc3sga\Class{7F4C5B83-2680-40AF-9AE9-2161AA759EF2}][HKEY_CLASSES_ROOT\PackagedCom\Package\DropboxInc.Dropbox_159.4.5870.0_x86__wkt425jdc3sga\Class{F3BC3DAF-431B-4F0E-B105-E9BB76335840}]

... но я даже не могу совместно создать IUnknown для любого из этих идентификаторов классов - даже в расширении оболочки, работающем в проводнике Windows, не говоря уже о моем собственном приложении. Я получаю ошибку HRESULT 0x80040154 (-2147221164)

В общем, как мне найти эти предметы? (Обратите внимание, что если я использую ICatInformation::EnumClassesOfCategories(), элементы Dropbox не определяются с информацией о категории.) Если нет возможности составить полный список, есть ли хотя бы способ получить доступ к известным объектам, таким как объекты Dropbox?

0 ответов

Другие вопросы по тегам