2012-03-27 1 views
0

나는 C++ 셸 확장 DLL을 가지고 있습니다. 초기화 메서드는 탐색기 창 왼쪽의 트리 트리 뷰 폴더를 클릭하면 두 번 호출됩니다. 그러나 탐색기 창 오른쪽 창에서 폴더를 클릭하면 Initialize 메서드가 한 번 호출됩니다.Windows 7 - 셸 확장 dll 탐색기 왼쪽 창에서 두 번 호출되는 메서드 초기화

왼쪽 창 트리보기를 클릭하면 새로 추가 된 메뉴 항목이 컨텍스트 메뉴에 두 번 표시됩니다.

궁금한 점은 창 기능입니까? 나는 아래의 코드 내 모든 구현을 주석하고 테스트 한 : 나는 왼쪽 창을 클릭하면

IFACEMETHODIMP CMyContextMenu::QueryContextMenu(HMENU hmenu, UINT /*uIndex*/, UINT cmdFirst, UINT /*uidCmdLast*/, UINT /*uFlags*/) 
{ 
UINT cmdId = uidCmdFirst; 
OutputDebugString(L"QueryContextMenu"); 

    return MAKE_HRESULT (SEVERITY_SUCCESS, FACILITY_NULL, cmdId - mdFirst); 
} 


IFACEMETHODIMP CMyContextMenu::Initialize(LPCITEMIDLIST pidlFolder, LPDATAOBJECT pDO, HKEY /*hkeyProgID*/) 
{ 
OutputDebugString(L"Initialize"); 
return S_OK; 
} 

의 DebugViewr 출력은 다음과 같습니다

초기화

QueryContextMenu 상황

초기화

QueryContextMenu

NoRemove Directory 
{ 
    NoRemove Background 
    { 
     NoRemove ShellEx 
     { 
      NoRemove ContextMenuHandlers 
      { 
       ForceRemove myContext = s '{AE843198-3C5D-4EA6-B74F-7A41FC91D7FF}' 
      } 
     } 
    } 
} 

NoRemove Directory 
{ 
    NoRemove ShellEx 
    { 
     NoRemove ContextMenuHandlers 
     { 
      ForceRemove myContext = s '{AE843198-3C5D-4EA6-B74F-7A41FC91D7FF}' 
     } 
    } 
} 

위의 레지스트리 항목은 Windows 7에서이 문제를 일으키는 것입니다. "NoRemove Background"를 제거하면 상황에 맞는 메뉴가 트리보기에 한 번 표시됩니다. 하지만 폴더 빈 영역을 클릭하면 Initialize 메서드가 호출되지 않습니다.

+0

난 당신이 상황에 맞는 메뉴 셸 확장에 대해 말하기한다고 가정합니다. 그렇다면 확실히 올바른 Windows 기능이 아닙니다. 코드를 게시 할 수 있습니까? – Flot2011

+0

초기화 (LPCITEMIDLIST pidlFolder, LPDATAOBJECT pDO, HKEY/* hkeyProgID * /). 이 방법으로 내 메뉴 채우기를하고 있습니다. 이 함수에 로그 메시지가 추가되었으며 초기화 메소드가 두 번 호출하는 것처럼 보입니다. – kanden

+0

서명뿐만 아니라 코드를 게시 할 수 있습니까? 그렇지 않으면 추측 게임 일뿐입니다. – Flot2011

답변

0

실제 프로그램 (명확한 설명을 위해 생략 된 응용 프로그램 특정 코드)에서 실제 예제를 게시하고 있습니다. 그것을 시도하십시오.

STDMETHODIMP CShlExtExample::Initialize (
LPCITEMIDLIST pidlFolder, LPDATAOBJECT pDataObj, HKEY hProgID) 
{ 
FORMATETC fmt = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; 
STGMEDIUM stg = { TYMED_HGLOBAL }; 
HDROP  hDrop; 

    // Look for CF_HDROP data in the data object. 
    if (FAILED(pDataObj->GetData (&fmt, &stg))) 
    { 
     // Return an "invalid argument" error. 
     return E_INVALIDARG; 
    } 

    // Get a pointer to the actual data. 
    hDrop = (HDROP) GlobalLock (stg.hGlobal); 
    if (NULL == hDrop) 
     return E_INVALIDARG; 

    // Make sure there is at least one file to show menu for. 
    UINT uNumFiles = DragQueryFile (hDrop, 0xFFFFFFFF, NULL, 0); 
    HRESULT hr = S_OK; 
    if (0 == uNumFiles) 
    { 
     GlobalUnlock (stg.hGlobal); 
     ReleaseStgMedium (&stg); 
     return E_INVALIDARG; 
    } 

    // Application specific code. 

    GlobalUnlock (stg.hGlobal); 
    ReleaseStgMedium (&stg); 

    return hr; 

}

STDMETHODIMP CShlExtExample::QueryContextMenu (
    HMENU hmenu, UINT uMenuIndex, UINT uidFirstCmd, 
    UINT uidLastCmd, UINT uFlags) 
    { 
    // If the flags include CMF_DEFAULTONLY then do nothing. 
    if (uFlags & CMF_DEFAULTONLY) 
     return MAKE_HRESULT (SEVERITY_SUCCESS, FACILITY_NULL, 0); 

    InsertMenu (hmenu, uMenuIndex, MF_BYPOSITION, uidFirstCmd, _T("Test Item")); 

    return MAKE_HRESULT (SEVERITY_SUCCESS, FACILITY_NULL, 1); 
    } 
+0

감사합니다 Flot2011, 나는 귀하의 코드를 구현하려고 시도합니다 – kanden

+0

나는 당신의 코드를 구현했습니다, 초기화 방법은 두 번 호출됩니다. 그러나 QueryContextMenu는 – kanden

+0

을 호출하지 않습니다. 문제는 Windows 7에서만 발생합니다. – kanden

관련 문제