2014-02-18 4 views
0

파일 확장명을 확장하는 일반적인 방법이 내 필요에 맞지 않기 때문에 현재 셸 확장을 작성하고 있지만 여기에도 같은 문제가 있습니다.Windows 셸 확장이 정확한 파일 경로를 제공하지 않습니다.

단일 바로 가기 (* .lnk 파일)를 마우스 오른쪽 단추로 클릭하면 대상 경로가 표시됩니다. 많은 파일을 선택하고 바로 가기를 마우스 오른쪽 단추로 클릭하면 단 하나의 파일 만 가져옵니다. 바로 가기 대상 파일.

내 셸 확장은 아직 완료되지 않습니다,하지만 파일을 열거 코드의 부분은 이것이다 :

HRESULT CFileContextMenuExt::Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID) 
{ 
    HRESULT hr = E_INVALIDARG; 
    if (NULL == pdtobj) 
    { 
     return hr; 
    } 

    FORMATETC fe = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; 
    STGMEDIUM stm = {}; 

    // pDataObj contains the objects being acted upon. In this example, 
    // we get an HDROP handle for enumerating the selected files. 
    if (SUCCEEDED(pdtobj->GetData(&fe, &stm))) 
    { 
     // Get an HDROP handle. 
     HDROP hDrop = static_cast<HDROP>(GlobalLock(stm.hGlobal)); 
     if (hDrop != NULL) 
     { 
      // Determine how many files are involved in this operation. 
      UINT nFiles = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0); 
      if (nFiles != 0) 
      { 
       m_selectedFiles.clear(); 

       //Enumerates the selected files and directories. 
       for (UINT i = 0; i < nFiles; i++) 
       { 
        // Get the next filename. 
        int size = DragQueryFile(hDrop, i, NULL, 0) + 1; 
        string_t str; 
        str.resize(size); 
        if (DragQueryFile(hDrop, i, &str[0], size) == 0) 
         continue; 

        m_selectedFiles.push_back(str); 
       } 
       hr = S_OK; 
      } 

      GlobalUnlock(stm.hGlobal); 
     } 

     ReleaseStgMedium(&stm); 
    } 

    // If any value other than S_OK is returned from the method, the context 
    // menu is not displayed. 
    return hr; 
} 

누군가의 조언이 얼마나 정확한 경로 대신 목표의를 얻을 수 있습니까?

+0

이미 보셨나요? http://www.codeproject.com/Articles/445/The-Complete-Idiot-s-Guide-to-Writing-Shell-Extens –

+0

링크를 제공해 주셔서 감사합니다. 내 문제를 해결하십시오. – ST3

+0

IShellLink 인터페이스를 구현해야합니다. – user2120666

답변

3

(필자는 다음과 같은 솔루션이 절대적으로 옳다고 확신하지 어쩌면 어떤 경우에는이 제대로 작동하지 않을 수 있지만 표준 경우에 나는 그것이 잘 작동 테스트 한)

당신은 아래에 당신에게 컨텍스트 메뉴 핸들러를 등록해야합니다 * 및 lnkfile. 즉, QueryContextMenu 바로 가기를 마우스 오른쪽 버튼으로 클릭하면 두 번 호출됩니다. 바로 가기 파일 대상은 처음으로, 바로 가기 파일 자체는 두 번째로 표시됩니다. 그러나 작은 차이가 있습니다. 바로 가기 파일 대상 쉘은 항상 CMF_VERBSONLY를 전달하며이 플래그는 바로 가기 파일 자체에는 없습니다. 따라서이 플래그를 체크하고 존재하는 경우 아무것도 추가하지 마십시오.

+0

정적 동사 또는 동적 쉘 확장에 대해 이야기하고 있습니까? – ST3

+0

@ ST3 나는 동적 인 것에 대해 말하고있다 –

+0

위대한 대답, 감사합니다 :) 완벽하게 작동합니다. – ST3