2014-02-18 2 views
0

На данный момент я пишу расширение оболочки, потому что регулярный способ расширения контекстного меню файла не соответствует моим потребностям, однако я сталкиваюсь с той же проблемой здесь.Windows Shell Extension не дает точных путей к файлам

Если я нажимаю правой кнопкой мыши на один ярлык (* .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

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