Иконка на тулбаре из "недоступного" файла

Обсуждение Total Commander. Установка, использование, настройка, решение проблем, скрытые функции. Обсуждение новых версий.

Модераторы: d-view, Моторокер, Avada, CaptainFlint, Nik

Ответить
Аватара пользователя
gora
Сообщения: 442
Зарегистрирован: Чт дек 30, 2004 13:09
Откуда: Иваново

Иконка на тулбаре из "недоступного" файла

Сообщение gora »

Win 7 x64, TCb25 x86
Создал кнопку на тулбаре

Код: Выделить всё

TOTALCMD#BAR#DATA
c:\Windows\System32\msconfig.exe

c:\Windows\System32\msconfig.exe
msconfig
c:\Windows\System32\
0
-1
Кнопка не работает и это понятно. Не понятно почему отображается иконка из msconfig.exe? Если попытаться найти файл для этой иконки через настройки кнопки, то файла не обнаружится, т.к., он расположен в папке, которая не видна из x86 ТС. Так почему же x86 ТС находит и отображает иконку из этого файла?
Win7 SP1 Ultimate x64, TC8.52a x64
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

gora
Если удалить br2 текущего бара, иконка остаётся после переоткрытия панели?
Аватара пользователя
CaptainFlint
Сообщения: 6239
Зарегистрирован: Вт дек 14, 2004 22:34
Контактная информация:

Сообщение CaptainFlint »

Flasher
Остаётся. :?
Вообще, занятно: если открыть диалог настройки панели инструментов, там значка нет ни в области набора кнопок, ни в поле "Значок". Но при нажатии OK на самой панели значок исправно отображается. ProcMon показывает, что Тотал сначала пытается открыть msconfig.exe из каталога SysWOW64, не находит файла, после чего открывает msconfig.exe из System32 и, судя по всему, считывает значок оттуда.

Добавлено спустя 1 час 58 минут:

Похоже, это особенность самой винды. Я помониторил, какие API-функции использует Тотал для загрузки значков: это LoadLibraryEx с флагом LOAD_LIBRARY_AS_DATAFILE. Так вот, оказывается, что если я в 32-битном приложении загружаю библиотеку из system32 с этим флагом, она подгружается нормально. Без этого
флага возвращает ошибку, что файл не найден.

То есть, получается, что редирект файловой системы в виндах построен сложнее, чем тупое перенаправление абсолютно всех запросов в другую папку. Перенаправляются только те запросы, которые потенциально приведут к ошибке (типа загрузки 64-битной библиотеки в память 32-битного процесса), а если из библиотеки вытаскиваются только ресурсы (которые от битности не зависят), то сначала проверяется каталог syswow64, а если вернулась ошибка, то выполняется попытка обработать тот же путь, но без редиректа.

Последнее, кстати, легко проверяется: если в каталоге SysWOW64 скопировать какой-нибудь mspaint.exe под именем msconfig.exe, удалить BR2-файл и перезапустить 32-битный Тотал, то у кнопки в панели инструментов окажется значок mspaint.
Почему же, ё-моё, ты нигде не пишешь "ё"?
Аватара пользователя
gora
Сообщения: 442
Зарегистрирован: Чт дек 30, 2004 13:09
Откуда: Иваново

Сообщение gora »

CaptainFlint
Спасибо за разъяснения.
Win7 SP1 Ultimate x64, TC8.52a x64
Ответить