Расширение Windows Shell не дает точных путей к файлам

0

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

Если я щелкнул правой кнопкой мыши по единственному ярлыку (*.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
    Вы уже видели: codeproject.com/Articles/445/…
  • 0
    Спасибо за ссылку, однако это не решает мою проблему.
Показать ещё 1 комментарий
Теги:
shell-extensions

1 ответ

3
Лучший ответ

(Я не уверен, что следующее решение абсолютно правильно, и, возможно, в некоторых случаях оно будет работать неправильно, но в стандартном случае я тестировал его отлично)

Вы должны зарегистрировать обработчик контекстного меню под * и lnkfile. Это означает, что при щелчке правой кнопкой мыши на ярлыке QueryContextMenu будет вызываться дважды. Первый раз для ссылки на ярлык и второй раз для самого ярлыка. Но есть небольшая разница. Для ярлыка файла целевая оболочка всегда передает CMF_VERBSONLY, и этот флаг отсутствует для самого ярлыка. Поэтому просто отметьте этот флаг и ничего не добавьте, если он есть.

  • 0
    Вы говорите о статических глаголах или о динамических расширениях оболочки?
  • 0
    @ ST3 я говорю о динамике
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню