Я заметил, что метод IShellLinkW :: GetPath возвращает пустую строку, если цель ярлыка указывает на специальную папку, например «Мой компьютер», или апплет панели управления.
Пример кода
' CLSID_ShellLink from ShlGuid.h
Dim cShellLink As New CShellLink()
' https://msdn.microsoft.com/en-us/library/windows/desktop/ms687223%28v=vs.85%29.aspx
Dim persistFile As IPersistFile = DirectCast(cShellLink, IPersistFile)
persistFile.Load(lnkFilePath, 0)
Dim target As New StringBuilder(260)
' https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nn-shobjidl_core-ishelllinkw
Dim lnkW As IShellLinkW = DirectCast(cShellLink, IShellLinkW)
lnkW.GetPath(target, target.Capacity, Nothing, IShellLinkGetPathFlags.RawPath)
(Извините, слишком много P / Invokes, чтобы поделиться здесь, но вы можете найти их в этом хранилище.)
Приведенный выше код корректно работает для получения цели любого файла .lnk, который указывает на файл или каталог. Он не может получить цель, которая указывает на специальный элемент / виртуальные папки.
Мои вопросы:
Это задумано? Если нет, то что я пропускаю или делаю не так? (может быть, мои определения неверны?). И что мне нужно сделать, чтобы получить специальную цель? Обратите внимание, что я хотел бы получить цель, чтобы отобразить ее в PropertyGrid
, а также создать новую цель с клоном специальной цели.
Обратите внимание, что язык программирования, на котором я разработал этот код, не имеет значения, потому что я сначала прошу об ориентации, а также я принимаю любое решение, написанное на C #.