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

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

19.03.2014, 02:42. Показов 3587. Ответов 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
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 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
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
19.03.2014, 10:27
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
не перейду на семёрку
Не только 7-ка 64 разрядная бывает, XP тоже
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 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
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 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
18033 / 7736 / 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
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
19.03.2014, 16:28
Цитата Сообщение от Dragokas Посмотреть сообщение
собственно проекта нет
У меня нет под рукой сейчас VB6, поэтому прошу проект (скомпилированный)
Цитата Сообщение от Dragokas Посмотреть сообщение
Как пользоваться той табличкой?
Бегом просмотрел, если установлен бит, то соответствующая секция представлена в файле, если нет то пропущена, но есть информационные биты. Соответственно порядок секций определяется порядком в спецификации A-Z (AA)
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 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
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
19.03.2014, 16:45
0x8009B - 1000 0000 0000 1001 1011
A,B,D,E,H,T
Вроде так
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
19.03.2014, 17:24  [ТС]
Ладно. Задам еще один тупой вопрос.
Как перевести:
1000 0000 0000 1001 1011
в
A,B,D,E,H,T
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 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
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
19.03.2014, 17:52  [ТС]
Ок. Первая строка таблицы - номер бита.
Дык, согласись, что криво нарисовали таблицу.
Без 100 грам веселого вещества не разобраться.
Спасибо за разъяснение.

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

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

Добавлено через 12 часов 22 минуты
Вопрос на засыпку: почему тогда на команду Kill не действует правило переадресации "Program Files" -> "Program Files (x86)" ?
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru