2016-11-08 9 views
0

CMF_CANRENAME으로 IContextMenu::QueryContextMenu을 호출 중이며 Windows XP에서 IContextMenu::InvokeCommand을 호출 할 때 이름 변경 작업을 처리하는 데 문제가 있습니다.IContextMenu를 호출 할 때 이름 변경 작업을 어떻게 처리합니까?

저는 네임 스페이스 확장이 아니며 DefView/IShellView를 사용하고 있지 않지만 IServiceProvider을 구현하는 사이트를 제공하고 있습니다.

최신 버전의 Windows에서 IFolderView2를 구현하는 서비스에 대해 쿼리되었으므로 셸에서 IFolderView2::DoRename을 호출하고 이름 바꾸기 작업을 시작할 수 있습니다.

그러나 Windows XP에서는 SID_DefView 서비스를 쿼리하지만 해당 서비스를 구현하는 방법에 대한 정보를 찾을 수 없습니다.

인터페이스 그것 (shell32를! CDefFolderMenu :: _ ProcessRename) 요구된다 {985F64F0-D410-4E02-BE22-DA07F2B5C5E1} 내가이 IDefViewFrame3의 IID입니다 레지스트리에서 볼 수 있지만, 문서화되지 않은 것 같다 ! 반면 IDefViewFrame은 문서화되어 있지만 MSDN에서 말하는 것은 "IUnknown 기능에만 사용되며 자체적 인 방법은 없습니다."입니다.

이 상황에서 XP에서 이름 바꾸기 작업을 처리하는 방법이 있습니까?

IDefViewFrame3 인터페이스를 위조하고 싶지 않지만 내가 생각할 수있는 유일한 다른 옵션은 이름 바꾸기 동사인지 확인하고 TrackPopupMenu 이후에 직접 처리하는 것입니다. 모든 제 3 자 네임 스페이스 확장을 올바르게 처리 할 것을

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

DoRenameInvokeCommand 내부 DefView에 의해 호출되지만 너무 모호하고 문서화 이후는 않을 :

+0

실제로 XP를 지원해야하는지 여부를 고려하십시오. –

+0

질문을 올바르게 읽는 경우 코드의 다른 부분이 코드 이름을 바꾸어 이름을 지정하도록 요청하고 내부적으로 실제 컨텍스트 메뉴를 사용하여 실제 이름을 바꿉니다. 그게 맞습니까? 초기 이름 변경 요청을 받기 위해'IDefViewFrame3'을 구현하는 방법을 묻고 있습니까? –

+0

실제 이름 바꾸기에는'TrackPopupMenu()'가 필요하지 않습니다. 'QueryContextMenu()'를 사용하면 메뉴 항목으로'HMENU'를 채우고,'Rename' 메뉴 항목을 찾아 ID를'InvokeCommand()'에 넘겨 줄 것입니다. 또는'QueryContextMenu()'를 건너 뛰고 하드 코딩 된 "이름 바꾸기"동사를'InvokeCommand()'에 전달하십시오. –

답변

0

IDefViewFrame3는 Windows XP에서의 IUnknown 후 다음과 같습니다 따라서 IDefViewFrame3을 구현하더라도 InvokeCommand이 실패하면 이름 바꾸기 동사를 확인해야합니다.