DragDropHandlers IShellExtInit::Initialize и UNC-пути NETHOOD

У меня есть расширение оболочки, зарегистрированное в HKCR\Folder\shellex\DragDropHandlers, и мне нужно вызвать GetVolumePathName()+GetVolumeInformation() в целевой папке (PIDL передается вам в IShellExtInit::Initialize)

Проблема в том, что когда что-то перетаскивается на «ярлык Nethood» (My Network Places\sharename), PIDL, передаваемый в Initialize, относится к ярлыку Nethood, а не к пути UNC! (Вызов SHGetPathFromIDList для PIDL возвращает "%USERPROFILE%\NetHood\SHARE on MACHINE", а не "\\MACHINE\SHARE", как вы ожидаете)

Я также попытался создать IShellItem PIDL и вызвать IShellItem::GetDisplayName с различными значениями SIGDN, но ни один из них не возвращает путь UNC.

Как я могу получить путь UNC из этого PIDL?


person Anders    schedule 22.04.2011    source источник
comment
AFAIR — это папки, содержащие файлы «desktop.ini» и «target.lnk». Вы должны разрешить «target.lnk» в папке.   -  person Sertac Akyuz    schedule 22.04.2011
comment
Да, я знаю, что они содержат эти файлы, но самостоятельное их разрешение не может быть правильным способом сделать это. target.lnk — это деталь реализации IShellFolder, которая обрабатывает папку nethood.   -  person Anders    schedule 22.04.2011


Ответы (1)


person    schedule
comment
Редактировать: параметр SFGAOF GetAttributesOf является IN и OUT, я думаю, SFGAO_LINK — это кешированный флаг, и вам повезло;) - person Anders; 23.04.2011
comment
Я подозреваю, что есть несколько способов снять шкуру с этого кота, возможно, с помощью IPersistFolder3::GetFolderTargetInfo() или SHGetDataFromIDList(SHGDFIL_NETRESOURCE), но я приму это как ответ, если кто-то не придумает лучший (и/или задокументированный) способ. .. - person Anders; 23.04.2011
comment
Хорошо поймал; вероятно, возвращает все атрибуты, если вы передаете 0, хотя это не задокументировано. Что касается других методов, я бы придерживался этого, поскольку он более общий. - person Luke; 23.04.2011