Мне трудно получить список выбранных файлов в моей реализации ContextMenu, когда цель моего щелчка правой кнопкой мыши является ярлыком. Дескриптор глобальной памяти возвращает список, содержащий только элемент ярлыка, и, кажется, не знает ни о каком другом элементе, который я выбрал.
Я заметил такое поведение во многих сторонних приложениях, включая Notepad ++, WinRar и UltraEdit.
Как правильно получить список выбранных файлов, если цель щелчка правой кнопкой мыши является ярлыком? Это не проблема для функции сжатия файлов, встроенной в Проводник (щелкните правой кнопкой мыши> отправить в> сжатую сжатую папку).
Изменить: вот небольшой фрагмент моего текущего метода. pida->cidl
становится 1, когда целью является ярлык, в противном случае это правильное количество элементов, которые я выбрал:
CStgMedium me;
pDataObj->GetData(&fe, &me);
LPIDA pida = reinterpret_cast<LPIDA>(me.hGlobal);
for(UINT i = 0; i < pida->cidl; i++) {
...
}
Мы говорим о IContextMenu
интерфейс здесь? Если это так, вы должны сделать это так (ошибки возможны, я пишу без компилятора):
Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID){
FORMATETC fetc = { CF_HDROP, null, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
STGMEDIUM stgm;
pdtobj->GetData(&fetc, &stgm);
UINT count = DragQueryFile(stgm.hGlobal, 0xFFFFFFFF, null, 0);
char filename[255];
for (int i=0; i<count; i++){
DragQueryFile(stgm.hGlobal, i, filename, 255);
// Here do something with i-th filename
}
}
Я упустил проверку ошибок для простоты.
Других решений пока нет …