|
|
|||||||||||
Как узнать объект ярлыка в 64-битной ОС19.03.2014, 02:42. Показов 3526. Ответов 30
Метки x64 shortcut (Все метки)
Имею ярлык к Internet Explorer. Браузер находится в папке C:\program files
При выполнении кода:
Воспользовался файловой переадресацией = не помогает. Кликните здесь для просмотра всего текста
1) Какие будут советы? 2) Может есть где спецификация самого формата данных?
0
|
|||||||||||
| 19.03.2014, 02:42 | |
|
Ответы с готовыми решениями:
30
Как узнать, подвержена ли 64-битной переадресации указанная ветвь реестра?
Как узнать существует ли объект ? |
|
Модератор
|
|
| 29.03.2014, 22:15 | |
|
0
|
|
|
|
||
| 30.03.2014, 02:45 [ТС] | ||
|
Видел. Да, действительно, пишут только о System32/SysWow64.
Вопрос только, является ли преадресация Program Files -> Program Files(x86) частью этого механизма (но ее не упомянули в статье) или проблема с определением ярлыка - это особый частный случай. (я склоняюсь ко второму) Вот факт - из 32-битного процесса: Kill "c:\windows\system32\file.txt" удаляет файл в папке syswow64 kill "c:\program files\file.txt" этот самый файл и удаляет. Переадресации нет. P.S. Скомпилировал код C++ от Peter Thoemmes для выдергивания пути из ярлыка согласно спецификации. Еще пригодится для будущих экспериментов.
0
|
||
|
Ушел с форума
|
||||||
| 31.03.2014, 22:18 | ||||||
Сообщение было отмечено The trick как решение
Решение
Насколько мне известно, файловые WOW64-редиректы работают только
для системных папок. Для Program Files действует другой механизм. Во-первых, у WOW64-процессов системная переменная ProgramFiles указывает на "C:\Program Files (x86)". Во-вторых, системные функции получения стандартных путей типа SHGetFolderPath для WOW64-процессов тоже возвращают 32-битную "Program Files (x86)". В-третьих, если WOW64-процесс пишет в реестр строковое значение, содержащее путь к одной из системных папок, в том числе и "Program Files", он автоматически преобразуется системой к 32-битному варианту. За это уже отвечает registry redirector. Но в остальном нет никаких препятствий, чтобы 32-битный exe поставить и запускать из 64-битной "нативной" папки "Program Files", то же самое, по идее, должно действовать и для ярлыков. Хотя если 32-битная программа захочет "узнать", где находится "Program Files", система неизбежно "подсунет" ей "Program Files (x86)". Вот таким скриптом я создаю ярлык на запуск 64-битного Internet Explorer, и не имеет значения, ни из-под какого процесса этот ярлык создается и запускается (32 или 64 бита) - во всех случаях наблюдаю запуск именно 64-битной версии IE, никаких редиректов в "Program Files (x86)" нету:
Dragokas, кстати, откуда в исходном коде, приведенном в первом сообщении темы, берется Program Files ? Не нашел. Может, он уже "приходит" туда в 32-битном обличии (x86) ?
2
|
||||||
|
Модератор
|
||||||
| 31.03.2014, 22:36 | ||||||
|
На "обычные" API переадресация не работает с Program Files (CreateFile, FindFirstFile, GetFileAttributes и т.п.), работает только с функциями SHELL, так в MSDN и написано. Например написав в VB
Dragokas, ты писал парсер, проверь чем отличается (изнутри) ярлык созданный через Explorer и через скрипт Убежденного (если он у тебя отрабатывает).
0
|
||||||
|
|
||||||
| 31.03.2014, 23:43 [ТС] | ||||||
|
Убежденный, превосходное наблюдение.
Ярлык создается примерно в 2х раза меньшего размера, при этом папка Program Files считывается из него без "переадресации" в отличие от ярлыка нативно созданного через explorer. Создавал таким кодом под x32 процессом
Есть различия в 1 байте (смещение 16), а также всех байтов, начиная с 2DF (ярлыки приаттачил). Пробую соотнести со спецификацией. ________________________ смещение 14 (4 байта) - LinkFlags, задающий наличие секций. 9B 00 00 00 (vbs) - отсутствует секция "EnableTargetMetadata". 9B 00 08 00 (explorer) Да, похоже виноват алгоритм обработки KnownFolder. Заодно еще один парсер нашел - shellify.
1
|
||||||
|
|
|
| 01.04.2014, 00:45 [ТС] | |
|
А вот похоже и сам код, который Microsoft использует в ОС
для получения пути для указанного Known Folder GUID: CppShellKnownFolders В нем используется функция SHGetKnownFolderPath. Скомпилировал под x32 и x64 кому интересно. x32 версия всегда выдает Program Files (x86). Похоже тупо подставляет нужное значение переменной в зависимости от разрядности процесса, как и описано здесь.
0
|
|
|
|
||||||
| 08.06.2015, 12:46 [ТС] | ||||||
|
Чтобы дать теме логическое завершение, скажу, что ярлыки, создаваемые Explorer,
цель которых пролегает через специальные папки, создаются с добавлением Extra Data Block. Когда система начинает разбор пути и видит наличие одной из секций: - 2.5.6. KnownFolderDataBlock - 2.5.9. SpecialFolderDataBlock то формирование пути происходит с участием раскрытия переменной окружения, указанной в этих секциях (что приводит к получению другого значения под WOW64). Чтобы однозначно идентифицировать реальный путь, можно, к примеру прочитать SpecialFolderDataBlock и по номеру CSIDL узнать: '38 = %ProgramFiles% '42 = %ProgramFiles(x86)% Другие значения: CSIDL - http://code.snapstream.com/api... CSIDL.html Аналогичная ситуация с переменной %CommonProgramFiles%. Касаемо KnownFolderDataBlock, ее GUID можно также проверить по этому списку: https://msdn.microsoft.com/en-... s.85).aspx Например, {6D809377-6AF0-444b-8957-A3773F02200E} - ProgramFilesX64 {7C5A40EF-A0FB-4BFC-874A-C0F2E0B9FA8E} - ProgramFilesX86 Парсинг этих секций можно провести примерно так: Кликните здесь для просмотра всего текста
2
|
||||||
| 08.06.2015, 13:53 | |
|
Не по теме: Dragokas, не перестаешь удивлять своими знаниями и
0
|
|
| 08.06.2015, 20:58 [ТС] | |
|
Не по теме:
0
|
|
| 08.06.2015, 20:58 | |
|
Помогаю со студенческими работами здесь
31
Как узнать объект события? Внедрение из 32-битной программы 64-битной dll в 64-битный процесс, возможно ли? 'Какой размер имеет переменная типа int в 32 битной и в 64 битной OC? Как узнать, открыт ли объект SELECT? Как узнать находится ли объект в фокусе Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|