2016-11-08 5 views
0

Я звоню IContextMenu::QueryContextMenu с CMF_CANRENAME, и у меня возникают проблемы с обработкой операции переименования при вызове IContextMenu::InvokeCommand в Windows XP.Как вы обрабатываете операции переименования при вызове IContextMenu?

Я не расширение пространства имен, и я не использую DefView/IShellView, но я предоставляю сайт, который реализует IServiceProvider.

В новых версиях Windows я запрашиваю для службы, которая реализует IFolderView2 и вызовы оболочки IFolderView2::DoRename, и я могу запустить операцию переименования.

В Windows XP он запрашивает службу SID_DefView, но я не могу найти никакой информации о том, как я должен реализовывать эту службу.

Интерфейс он (Shell32 CDefFolderMenu! :: _ ProcessRename) просит есть {985F64F0-D410-4E02-BE22-DA07F2B5C5E1} и я могу видеть в реестре, что это IID для IDefViewFrame3, но это, кажется, без документов ! IDefViewFrame, с другой стороны, задокументирован, но единственное, что говорит MSDN, - «Используется только для его функций IUnknown, у него нет собственных методов».

Есть ли документированный способ обработки операций переименования на XP в этой ситуации?

Я действительно не хочу подделывать интерфейс IDefViewFrame3, но единственный вариант, о котором я могу думать, это посмотреть, является ли он переименованным глаголом и просто обрабатывать его сам после TrackPopupMenu.

+0

Рассмотрите, действительно ли вам нужно поддерживать XP. –

+0

Если я правильно читаю ваш вопрос, некоторые другие фрагменты кода требуют, чтобы ваш код выполнял операцию переименования, и вы внутренне используете контекстное меню оболочки для выполнения фактического переименования. Это правильно? Вы спрашиваете, как реализовать 'IDefViewFrame3' для получения этого первоначального запроса на переименование? –

+0

Для фактического переименования вам не нужно 'TrackPopupMenu()'. Вы просто «QueryContextMenu()», чтобы заполнить «HMENU» с помощью пунктов меню, затем найдите пункт меню «Переименовать» и передайте его идентификатор на 'InvokeCommand()'. Или просто пропустите 'QueryContextMenu()' и передайте жестко закодированное '' переименование ''глагола' InvokeCommand() '. –

ответ

0

IDefViewFrame3 выглядит следующим образом после IUnknown на Windows XP:

STDMETHOD(GetWindowLV)(THIS_ HWND*phwnd) PURE; 
STDMETHOD(ShowHideListView)(THIS) PURE; 
STDMETHOD(OnResizeListView)(THIS) PURE; 
STDMETHOD(ReleaseWindowLV)(THIS) PURE; 
STDMETHOD(DoRename)(THIS) PURE; 

и DoRename вызываются DefView внутри InvokeCommand, но так как это настолько неясно и документировано, маловероятно, что все расширения третьей стороны пространства имен обрабатывать его правильно поэтому даже если вы реализуете IDefViewFrame3, вам все равно придется проверять наличие переименованного глагола, если InvokeCommand терпит неудачу.

Смежные вопросы