В данный момент я пишу расширение Shell, потому что обычный способ расширения файлового контекстного меню не соответствует моим потребностям, однако здесь я сталкиваюсь с той же проблемой.
Если я щелкаю правой кнопкой мыши по одному ярлыку (* .lnk file), я получаю его целевой путь, если я выбираю много файлов и щелкаю правой кнопкой мыши по ярлыку, я получаю только один файл — целевой файл ярлыков.
Мое расширение оболочки еще не закончено, но часть кода, которая перечисляет файлы, такова:
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;
}
Может кто-нибудь посоветовать, как получить точные пути вместо целей?
(Я не уверен, что следующее решение является абсолютно правильным и, возможно, в некоторых случаях оно не будет работать правильно, но в стандартном случае, которое я протестировал, оно работает нормально)
Вы должны зарегистрировать свой обработчик контекстного меню в * и lnkfile. Это означает, что когда пользователь щелкнет правой кнопкой мыши по ярлыку, QueryContextMenu будет вызван дважды. Первый раз для целевого файла ярлыка и второй раз для самого файла ярлыка. Но есть небольшая разница. Для целевого файла ярлыка всегда передайте CMF_VERBSONLY, и этот флаг отсутствует для самого ярлыка файла. Так что просто отметьте этот флаг и ничего не добавляйте, если он присутствует.
Других решений пока нет …