Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.75/16: Рейтинг темы: голосов - 16, средняя оценка - 4.75
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16

Как узнать объект ярлыка в 64-битной ОС

19.03.2014, 02:42. Показов 3476. Ответов 30

Студворк — интернет-сервис помощи студентам
Имею ярлык к Internet Explorer. Браузер находится в папке C:\program files
При выполнении кода:
Visual Basic
1
msgbox CreateObject("WScript.Shell").CreateShortcut(Link).TargetPath
получаю путь C:\program files (x86)

Воспользовался файловой переадресацией = не помогает.

Кликните здесь для просмотра всего текста

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function IsWow64Process Lib "kernel32" (ByVal hProc As Long, bWow64Process As Boolean) As Long
Private Declare Function GetSystemWow64Directory Lib "kernel32.dll" Alias "GetSystemWow64DirectoryA" (ByVal lpBuffer As String, ByVal uSize As Long) As Long
Private Declare Function Wow64DisableWow64FsRedirection Lib "kernel32" (ByRef oldvalue As Long) As Boolean
Private Declare Function Wow64RevertWow64FsRedirection Lib "kernel32" (ByVal oldvalue As Long) As Boolean
 
Option Explicit
 
Private Sub main()
    Dim lWow64RedirectReturn As Long: lWow64RedirectReturn = 0
    Dim ret As Boolean
    
    Dim is64 As Boolean: is64 = Is64bitOS
    Debug.Print "Is OS 64-bit? " & is64
    
    If is64 Then ret = Wow64DisableWow64FsRedirection(lWow64RedirectReturn)
    Debug.Print "API = " & ret
    CheckRedirection
    GetLinkTarget
 
    If is64 Then ret = Wow64RevertWow64FsRedirection(lWow64RedirectReturn)
    Debug.Print "API = " & ret
    CheckRedirection
    GetLinkTarget
End Sub
 
Public Function Is64bitOS() As Boolean
    Dim bWow64Process As Boolean
    Dim handle As Long: handle = GetProcAddress(GetModuleHandle("kernel32"), "IsWow64Process") ' if IsWow64Process function exists
    If handle > 0 Then IsWow64Process GetCurrentProcess(), bWow64Process ' Is running under Wow64
    Is64bitOS = bWow64Process
End Function
 
Sub CheckRedirection()
    Dim exe: exe = Environ("SystemRoot") & "\system32\msg.exe"
    Debug.Print "Redirect = " & (Dir$(exe, vbReadOnly Or vbSystem Or vbHidden) <> vbNullString)
End Sub
 
Sub GetLinkTarget()
    Dim Link: Link = "C:\Users\Alex\Desktop\IE.lnk"
    Dim oLink: Set oLink = CreateObject("WScript.Shell").CreateShortcut(Link)
    Debug.Print oLink.TargetPath
    'Debug.Print oLink.WorkingDirectory
End Sub


1) Какие будут советы?
2) Может есть где спецификация самого формата данных?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.03.2014, 02:42
Ответы с готовыми решениями:

Как узнать, подвержена ли 64-битной переадресации указанная ветвь реестра?
Как это узнать программно? Кроме, как прямым сравнением со списком из базы знаний. И можно ли узнать новую цель (подраздел) после...

CMD/BAT: Узнать параметры ярлыка
Приветствую! Нужно узнать параметр (т.е. зачастую это &quot;C:\LOLKEK\app.exe -browser&quot;) ярлыков на рабочем столе (всех). Т.е. просто...

Как узнать существует ли объект ?
Родился новый вопрос: как узнать существует ли объект ??? тоесть есть ли в сесии Session('anArr'). в VB есть isObject, а как на...

30
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
19.03.2014, 07:00
я сделал запрос в гугле ...
ярлык OR 64 OR shortcut "WScript.Shell" -x86

и нашёл это может поможет ...

или вот ещё иностранный сайт Windows 7 x64: Выполнение 64-битной EXE / скрипт из командной строки 32bit?
1
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
19.03.2014, 09:36
Переадресация работает только на System32/SysWOW64
http://msdn.microsoft.com/en-u... 71305.aspx
1
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
19.03.2014, 10:26
Странно что столько проблем с 64разядными системами
и мало нормальных сведений и литературы, низачто не перейду на семёрку
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
19.03.2014, 10:27
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
не перейду на семёрку
Не только 7-ка 64 разрядная бывает, XP тоже
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
19.03.2014, 14:59  [ТС]
FelixMacintosh, такой вариант неприемлем. Я ищу решение не только для языка VB6.
Там пытаются обойти проблему через запуск 64-битного командного процессора.
Такой прием мне известен и успешно мною используется. Но нужны более классические методы, основанные на Win Api.

The trick, спасибо. То, что действует только на System32 <-> SysWow64 не знал.

Добавлено через 5 минут
The trick, о, за спецификацию отдельное спасибо.
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
19.03.2014, 15:03
Цитата Сообщение от Dragokas Посмотреть сообщение
The trick, о, за спецификацию отдельное спасибо.
Как бы работать напрямую с lnk нежелательно, формат может постоянно меняться. Но через IShellLink работать также не получится, по крайней мере в сети пишут именно про такую же ошибку как у тебя. Скинь мне проект я в отладчике посмотрю что там происходит внутри (у меня тоже x64 7), может удастся выяснить причину.
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
19.03.2014, 15:22
Цитата Сообщение от Dragokas Посмотреть сообщение
FelixMacintosh, такой вариант неприемлем.
извиняюсь, надеюсь я не очень навредил своими советами
Цитата Сообщение от Dragokas Посмотреть сообщение
The trick, о, за спецификацию отдельное спасибо.
У него семёрка, я с ним одно время переговаривался на тему
что некоторые его реализации к моей 32-х разрядной XP просто не подходят
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
19.03.2014, 16:18  [ТС]
The trick, собственно проекта нет.
Создаем ярлык, у которого в свойствах в строке объект:
C:\program files\iexplore.exe
и выполняем 1 строку кода из 1-го поста.

Можно тоже самое проверить с рабочим каталогом.
Создайте ярлык, у которого рабочий каталог = C:\program files
Выполним код:
Visual Basic
1
msgbox CreateObject("WScript.Shell").CreateShortcut(Link).CurrentDirectory
(хотя свойства объекта скорее всего заполняются все сразу при вызове метода).

Цитата Сообщение от The trick Посмотреть сообщение
формат может постоянно меняться
Почему? Как я понял с описания - за все время эволюции добавилась только секция VistaAndAboveIDListDataBlock, которая находится в конце .LNK

Если Вас не затруднит, можете скачать этот PDF ?

LinkFlags: (4 bytes, offset 0x0014), 0x0008009B means the following LinkFlags (section 2.1.1) are set:
- HasLinkTargetIDList
- HasLinkInfo
- HasRelativePath
- HasWorkingDir
- IsUnicode
- EnableTargetMetadata

Мне не понятно, как раскладываются биты. (страница 10 PDF-a) 2.1.1 LinkFlags
Как пользоваться той табличкой?
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
19.03.2014, 16:28
Цитата Сообщение от Dragokas Посмотреть сообщение
собственно проекта нет
У меня нет под рукой сейчас VB6, поэтому прошу проект (скомпилированный)
Цитата Сообщение от Dragokas Посмотреть сообщение
Как пользоваться той табличкой?
Бегом просмотрел, если установлен бит, то соответствующая секция представлена в файле, если нет то пропущена, но есть информационные биты. Соответственно порядок секций определяется порядком в спецификации A-Z (AA)
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
19.03.2014, 16:38  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
если установлен бит, то соответствующая секция представлена в файле, если нет то пропущена, но есть информационные биты.
Это я понимаю.
Не неясно как 0x0008009B разложить на биты, которые указаны в той табличке, чтобы найти соответствующие им описания.

Цитата Сообщение от The trick Посмотреть сообщение
У меня нет под рукой сейчас VB6, поэтому прошу проект (скомпилированный)
Усёк. Воообще можно так:
Bash
1
c:\windows\syswow64\cscript.exe my.vbs
Скомпилированный проект выкладываю.
Вложения
Тип файла: zip ie.zip (3.8 Кб, 8 просмотров)
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
19.03.2014, 16:45
0x8009B - 1000 0000 0000 1001 1011
A,B,D,E,H,T
Вроде так
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
19.03.2014, 17:24  [ТС]
Ладно. Задам еще один тупой вопрос.
Как перевести:
1000 0000 0000 1001 1011
в
A,B,D,E,H,T
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
19.03.2014, 17:35
Цитата Сообщение от Dragokas Посмотреть сообщение
Ладно. Задам еще один тупой вопрос.
Каждый бит соответствует букве, 0-A, 1-B и т.д. У тебя установлены 0,1,3,4,7,19 бит что соответствует A,B,D,E,H,T
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
19.03.2014, 17:52  [ТС]
Ок. Первая строка таблицы - номер бита.
Дык, согласись, что криво нарисовали таблицу.
Без 100 грам веселого вещества не разобраться.
Спасибо за разъяснение.

TSRQ PONM LKGI HGFE DCBA
1000 0000 0000 1001 1011
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
19.03.2014, 17:59
Вроде бы все понятно написано
Where the bits are defined as
Только вместо номеров бит они нарисовали дополнительно таблицу с соответствием каждому биту буквы(букв)
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
19.03.2014, 18:22  [ТС]
Не выдумывали бы это:
Цитата Сообщение от The trick Посмотреть сообщение
0-A, 1-B
а так и писали бы номера в расшифровке. Вот тогда и понятно.
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
20.03.2014, 00:25
Цитата Сообщение от Dragokas Посмотреть сообщение
Вот тогда и понятно.
Я при создании проекта создания GIF с прозрачным фоном, разбирался с официальной спецификацией. Вот это действительно непонятная дока.

Добавлено через 4 часа 39 минут
http://www.codeproject.com/Art... nk-GetPath
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
20.03.2014, 13:25  [ТС]
Круть, готовый парсер. Будет что показать Олегу Зайцеву

Добавлено через 12 часов 22 минуты
Вопрос на засыпку: почему тогда на команду Kill не действует правило переадресации "Program Files" -> "Program Files (x86)" ?
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
21.03.2014, 02:05
Цитата Сообщение от Dragokas Посмотреть сообщение
Вопрос на засыпку: почему тогда на команду Kill не действует правило переадресации "Program Files" -> "Program Files (x86)" ?
Kill для удаления файла вызывает API DeleteFileA из kernel32, Shell32 использует PIDL для идентификации,и возможно (пока не смотрел) меняет еще на этапе загрузки.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.03.2014, 02:05
Помогаю со студенческими работами здесь

Как узнать объект события?
Доброго времени суток. На фрейме несколько таблиц созданных в цикле. Все редактируемые. Как программно узнать какую из них я редактирую?...

Внедрение из 32-битной программы 64-битной dll в 64-битный процесс, возможно ли?
Добрый вечер. Для внедрение dll в сторонний процесс использую метод из книги Рихтера. Суть этого метода - создать удаленный поток в...

'Какой размер имеет переменная типа int в 32 битной и в 64 битной OC?
Объектно-ориентированное программирование в С++ Р. Лафоре.

Как узнать, открыт ли объект SELECT?
Как узнать, открыт ли объект SELECT, представленный в виде ComboBox?

Как узнать находится ли объект в фокусе
Создаю компонент. Как мне внутри компонента понять, что он находится в фокусе? if focused=true не пашет. Значение всегда false


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru