Как получить путь к файлу, зная путь к ярлыку?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Как получить путь к файлу, зная путь к ярлыку?

Сообщение arthur2 » 04.04.2008 (Пт) 11:12

Я знаю, где лежит ярлык:
c:\lalala\Ярлык для figlimigli.txt.lnk

Как мне теперь узнать, где лежит сам файл?

Тот же вопрос и про *.pif
Артур
 
   

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 04.04.2008 (Пт) 11:24

ShellLinkObject

Library Shell32
C:\WINDOWS\system32\SHELL32.dll
Microsoft Shell Controls And Automation

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 04.04.2008 (Пт) 15:00

Хе-хе.
Мало того, в сети можно найти описание формата LNK-файлов и выудить нужное значение непосредственно из ярлыка. Это гораздо быстрее, но только для дZенствующих... :wink:
А я все практикую лечение травами...

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 04.04.2008 (Пт) 16:09

Twister
вроде бы lnk-формат немного отличается на разных версиях винды...

я просто писал программу, которая работает с ссылкой ярлыка и однажды напоролся на "недопонимание"

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 05.04.2008 (Сб) 16:20

Konst_One
Подключил я эту библиотеку и посмотрел на ShellLinkObject... Что-то мне не очень понятно, как им пользоваться :(

Пока нашёл такую штуку:
Код: Выделить всё
Public Function getNameFromLink(fnm As String) As String
    Dim lBuffLen     As Long
    Dim cShellLink   As ShellLinkA        ' An explorer IShellLink instance
    Dim cPersistFile As IPersistFile      ' An explorer IPersistFile instance
    Dim fd   As WIN32_FIND_DATA
    Dim sExeFile As String
    sExeFile = Space$(MAX_PATH)
    lBuffLen = Len(sExeFile)
    On Error Resume Next
    Set cShellLink = New ShellLinkA       ' Create new IShellLink interface
    Set cPersistFile = cShellLink         ' Implement cShellLink's IPersistFile interface
    cPersistFile.Load StrConv(fnm, vbUnicode), STGM_DIRECT
    cShellLink.GetPath sExeFile, lBuffLen, fd, SLGP_UNCPRIORITY
   
    getNameFromLink = Trim$(sExeFile)
    Set cPersistFile = Nothing
    Set cShellLink = Nothing
End Function

Но, чёй-то мне этот способ не очень нравится. Работает, конечно, безотказно, но это - как из пушки по воробьям.

Twister
Да, мне кажется, нужно сделать именно так... Пытаюсь рыть в этом направлении. Но я, увы, не очень продвинут.

kibernetics
Поделись наработками, если не жалко? [/code]
Артур
 
   

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 05.04.2008 (Сб) 17:51

То есть, тебя устраивает тот факт, что на какой-то машине твой код может не работать, так?
label:
cli
jmp label

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 05.04.2008 (Сб) 19:47

iGrok
Наработки не обязательно тупо копировать - можно же и попытаться понять, что не так.

Во всяком случае, разбираться с нуля сложнее.
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 05.04.2008 (Сб) 20:07

Но, чёй-то мне этот способ не очень нравится. Работает, конечно, безотказно, но это - как из пушки по воробьям.

Очередное заблуждение.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 06.04.2008 (Вс) 0:47

Очень убедительное возражение с другого форума:

ANDLL
Оно конечно хочется открыть файл и прочитать из него пару байтов, ибо кажется что это работает быстрее и вообще куда круче.
На самом деле lnk - внутренний формат, который вообще может меняться даже внутри версии операционной системы, поэтому читать его "руками" значит в конце концов найти ситуацию, в которой твоя программа не сможет правильно сработать.
Так что куда лучше "поднимать все эти интерфейсы", чем читать самому.


В общем, кажется, придётся всё же через IShellLink, благо что работает нормально.
Артур
 
   

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 06.04.2008 (Вс) 14:33

Что и требовалось доказать.. )
label:
cli
jmp label

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 07.04.2008 (Пн) 6:22

Оно конечно хочется открыть файл и прочитать из него пару байтов, ибо кажется что это работает быстрее и вообще куда круче.
На самом деле lnk - внутренний формат, который вообще может меняться даже внутри версии операционной системы, поэтому читать его "руками" значит в конце концов найти ситуацию, в которой твоя программа не сможет правильно сработать.
Так что куда лучше "поднимать все эти интерфейсы", чем читать самому.

вроде бы lnk-формат немного отличается на разных версиях винды...
А вроде бы нет. Какой смысл его менять?
Повторю еще раз - этот формат не менялся давно и причины его менять пока тоже нет.
А я все практикую лечение травами...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 07.04.2008 (Пн) 7:54

Twister, меняется, и сильно.
Ярлык на самом деле может ссылаться на самую разную информацию и в зависимости от ее типа отличается довольно сильно.
Сравни обычный ярлык, который ты можешь сделать на файл, ярлык на какую-нибудь специальную папку ("Мой компьютер" или иное), ярлык на сетевое подключение, ярлык на любую из программ Microsoft Office, который делает сам установщик.
Lasciate ogni speranza, voi ch'entrate.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 07.04.2008 (Пн) 8:33

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

Представь, если бы было несколько различных форматов PE - один для ЕХЕ, другой для DLL, третий для SYS... Абсурд.

Я не утверждаю, что мелкомягким не взбредет в голову изменить формат, я утверждаю, что со времен w2k вплоть до vista они этого не сделали...
А я все практикую лечение травами...

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 07.04.2008 (Пн) 17:32

Twister
отличается...
ей-богу, косячишко какойто в нём есть...

я пробовал по этому описанию, ничего не вышло. есть lnk которые както особо генерятся.
пришлось сделать через WScript.Shell

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 08.04.2008 (Вт) 9:03

Twister, у меня есть описание.
Посмотри ярлыки, которые установщик Microsoft Office делает.
Там вообще непосредственного пути к исполняемому файлу нет.
И напрямую из файла, без использования интерфейсов, этот путь ты не получишь.
Lasciate ogni speranza, voi ch'entrate.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 08.04.2008 (Вт) 9:27

arthur2
наработки у меня специфические.
на форму объект PictureBox и в событии Picture1_OLEDragDrop
пишешь код:
Код: Выделить всё
Dim w As Object, S As Object
Set w = CreateObject("WScript.Shell")
Set S = w.CreateShortcut(Data.Files(1))
Debug.Print s.TargetPath
Set S = Nothing
Set w = Nothing

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

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 09.04.2008 (Ср) 20:36

kibernetics
Так у тебя через этот способ было недопонимание с какими-то из ярлыков?
А я думал, что через WScript с ярлыками работать надёжно... Ну вот.

alibekА из ярлыков офиса и с интерфейсами вытаскивается чё-то крайне странное:
C:\WINXP\Installer\{90110419-6000-11D3-8CFE-0150048383C9}\wordicon.exe
:(
Любопытно, к чему в офисе такой мудрёж и что он даёт?
Артур
 
   

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 10.04.2008 (Чт) 7:50

Это путь к значку.
Lasciate ogni speranza, voi ch'entrate.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 10.04.2008 (Чт) 10:33

arthur2
да нет,
нету у меня недопонимания с моим методом пока что.
люди работают и бог с ним :)
разве что, если кто ехе-шник суёт, то ошибка вылазит.
надо подправить код.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 10.04.2008 (Чт) 10:50

alibek
Это путь, который возвращает тот же самый код, который для нормальных ярлыков возвращает путь к программе.

kibernetics
kibernetics писал(а):вроде бы lnk-формат немного отличается на разных версиях винды...

я просто писал программу, которая работает с ссылкой ярлыка и однажды напоролся на "недопонимание"

Я думал, что ты до этого пытался разобраться с форматом ярлыков и именно теми неудачными наработками просил поделиться.
Артур
 
   


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot и гости: 47

    TopList  
cron