Вопросы к статье "Файловые ассоциации: знакомимся на практике"

Dragokas

Angry & Scary Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
7,813
Реакции
6,592
https://safezone.cc/threads/fajlovye-associacii-znakomimsja-na-praktike.21990/

Я думаю статью нельзя считать завершенной из-за пары неоднозначностей.

Вот начало 2-го поста об "Открыть с помощью..."
Но может так случиться что и этого окажется не достаточно.
Ключевой вопрос - почему? Что имел в виду автор?

"VBSFile"=hex(0):
Это значение по умолчанию, Progid соответствующий ассоциации,не рекомендую менять эти настройки
А я такой вот придирчивый. И мне все же интересно, какие будут последствия.
Иначе - хотелось бы ссылочку для тех, кто желает подробностей (если оно того стоит).

Теперь предпоследний скрин:
1. Меня эта галочка насторожила "Использовать выбранную программу для всех файлов такого типа..."

меню открыть с помощью+блокнот.png


В статье не сказано, что если ее оставить, то изменится параметр реестра HKCR\{ ProgID }\Shell\Open\Command (так ведь?) - это очевидно, но стоит уточнить и сделать как вывод ко 2-й части статьи.
А также тот факт, что тогда порядок предпочтения MRUList изменится.
2. У тебя на скрине галочка неактивна. У меня в системе всегда активна (хотя видел и обратное). Почему?
3. В окне есть две разделенные группы: Рекомендуемые программы и другие программы. По какому принципу они формируется?
В каком случае программы переходят из одной категории в другую?
Не сказано также, что пункты раскрывающего контекстного меню "Открыть с помощью" состоят как раз из программ под категорией "Рекомендуемые".

Уверен для новичков это все не нужно, что туда добавить судя из этой темы, сам решишь. Но я бы пп.1,2 добавил.

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.vbs\OpenWithList]
"a"="NOTEPAD.EXE"
"c"="cmd.exe"
"d"="mspaint.exe"
"e"="WORDPAD.EXE"
"MRUList"="edabc"
a"="NOTEPAD.EXE (свернуть)
имя приложения,с помощью которого должны открываться файлы с заданным расширением.

Следует понимать как путь и имя, а не просто имя?

"Progid"="Applications\\NOTEPAD.EXE"
Как думаешь, что означает Applications в этом контексте?

Полезная ссылка MSDN - Default Programs
 
Последнее редактирование:
Ключевой вопрос - почему? Что имел в виду автор?

Имеется ввиду что такая запись будет иметь приоритет перед другими настройками.


Меня эта галочка насторожила "Использовать выбранную программу для всех файлов такого типа..."


Да,косяк.

Если поставить такую галочку,то будет создано новое правило,и это будет иметь приоритет выше всех перечисленных опций.

Если галочку не ставим то вопрос урегулируется записью:

Код:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.**\OpenWithList

Эта запись имеет приоритет перед текущими настройками.
И далее по статье.

Если стоит галочка "Использовать по умолчанию" то в реестре создается правило:

Код:
HKEY_USERS\{SID_User}\**_auto_file

Где {SID_User} соответственно SID пользователя,а ** это расширение файла.

Например:
Код:
[HKEY_USERS\S-1-5-21-1566998330-4110308949-553068737-1000_Classes\dd_auto_file]

Для файлов с расширением .dd установлена галочка

"Использовать выбранную программу для всех файлов такого типа..." для программы "Блокнот".

И тогда в реестре имеем запись:

Код:
Windows Registry Editor Version 5.00

[HKEY_USERS\S-1-5-21-1566998330-4110308949-553068737-1000_Classes\dd_auto_file]

[HKEY_USERS\S-1-5-21-1566998330-4110308949-553068737-1000_Classes\dd_auto_file\shell]

[HKEY_USERS\S-1-5-21-1566998330-4110308949-553068737-1000_Classes\dd_auto_file\shell\edit]

[HKEY_USERS\S-1-5-21-1566998330-4110308949-553068737-1000_Classes\dd_auto_file\shell\edit\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
  00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,4e,00,4f,00,\
  54,00,45,00,50,00,41,00,44,00,2e,00,45,00,58,00,45,00,20,00,25,00,31,00,00,\
  00

[HKEY_USERS\S-1-5-21-1566998330-4110308949-553068737-1000_Classes\dd_auto_file\shell\open]

[HKEY_USERS\S-1-5-21-1566998330-4110308949-553068737-1000_Classes\dd_auto_file\shell\open\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
  00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,4e,00,4f,00,\
  54,00,45,00,50,00,41,00,44,00,2e,00,45,00,58,00,45,00,20,00,25,00,31,00,00,\
  00

Декодировав которую мы видим что в программой для открытия файлов назначен блокнот.

И эта запись имеет приоритет перед предыдущей.
Следует понимать как путь и имя, а не просто имя?

Это имя ,тут я бы попытался ввести новый термин - правило
Официально нет в реестре такого термина,но иначе по русски не объяснить.
Этот параметр имеет такое же имя ,как указано в разделе
Код:
HKEY_CLASSES_ROOT\Applications\
Для конкретного приложения.

Например в
Код:
HKEY_CLASSES_ROOT\Applications\notepad.exe
Явно указано что должно происходить при вызове notepad.exe - это открытие объекта программой блокнот.
Посмотрев на команду в разделе notepad.exe\shell\open\command :
Код:
%SystemRoot%\system32\NOTEPAD.EXE %1

Мы наблюдаем и путь к приложению,и имя приложения и макрос.

Но если мы поменяем все имена в
Код:
CurrentVersion\Explorer\FileExts\.**\OpenWithList
И
Код:
HKEY_CLASSES_ROOT\Applications\notepad.exe
на superproga.exe вместо NOTEPAD.exe при этом оставив прежней команду и макрос то все равно запустится блокнот.

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

Да простят меня парни из Microsoft за такое самовольное внедрение термина)




Как думаешь, что означает Applications в этом контексте?

Здесь перечислены разделы,имена которых имеют названия,соответствующие названиям программ.
В имени раздела указаны команды которые должны выполняться для программ ,для которых создано правило.

О том что используется программа,для которой есть условие в разделе
Код:
HKEY_CLASSES_ROOT\Applications

свидетельствует запись вида:
1)
Код:
proga.exe
2)
Код:
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{4234d49b-0245-4df3-b780-3893943456e1}]
@="Applications"
upload_2014-1-3_20-41-44.png


3)
Код:
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{4234d49b-0245-4df3-b780-3893943456e1}]
@="Applications/texfile"

Ну и соответственно далее по аналогии.
А я такой вот придирчивый. И мне все же интересно, какие будут последствия.
Иначе - хотелось бы ссылочку для тех, кто желает подробностей (если оно того стоит).

Тут все не сложно.
По аналогии с UserChoice может быть прописан и ProgID ,который в свою очередь записывается в бинарном варианте,либо hex(0).

Сам теперь подумай,что будет если в настройках указан неверный ProgID )))На самом деле у тебя еще должен возникнуть вопрос по хэндлерам,я хочу про это в отдельной теме написать.Вроде все ответил,ничего не забыл?
 
Последнее редактирование:
Спасибо. Все кратко, демонстративно и предельно ясно.
Весьма неожиданные для меня ответы. Я то думал программа по-умолчанию изменяется в hkcr\{ prog id }\Shell\Open\Command
Без анализа реестра не додуматься.
Да простят меня парни из Microsoft за такое самовольное внедрение термина)
Говоришь, правила? :)
Ну я бы назвал более точнее - правило по-умолчанию для псевдонима.
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.vbs\UserChoice "Progid"="Applications\\NOTEPAD.EXE"
++ такой экперимент:
Имею inf-файл.
поставил галку "Открывать всегда через"... WordPad, ОК.
поставил галку "Открывать всегда через"... Notepad, ОК. (собственно так и было).
Что произошло в реестре?
Код:
"Progid"="inffile"
а не Applications\\NOTEPAD.EXE, как предполагалось.
Собственно Progid воспринимает как псевдоним, так и сам Progid типа файла.
На самом деле у тебя еще должен возникнуть вопрос по хэндлерам,я хочу про это в отдельной теме написать.
по каким хендлерам?
 
Оно как бы так, но не всегда работает (на примере того же 7zip).
Видимо в Win8 нужно использовать специальные API-функции, чтобы переназначать ассоциацию. Еще появилось такое понятие как "Начальный экран".
Надо разбираться. Как вариант, раскурочить готовую программу через Process Monitor.
 
Вроде разница только в:
Если тип файла уже зарегистрирован, создается разделOpenWithProgIDs или OpenWithList в разделе реестра

Но в семерке этого разве нет?
(посмотреть не на чем)

на примере того же 7zip

А что с ним не так?

У меня отлично работает.


Видимо в Win8 нужно использовать специальные API-функции, чтобы переназначать ассоциацию.

Смотрел у себя на 8.1 - все то же самое,интерфейс немного изменился.
Начальный экран - да,надо подглядеть где и что пишется,сегодня сделаю.
 
А что с ним не так?
У меня отлично работает.
Ну как же.
Устанавливаешь 7zip x64 (офсайт), а ассоциация 7z к архиватору не привязывается, так и остается ничейная (ОС полностью с нуля).
Могу промониторить изменения, если нужно.
 
Могу промониторить изменения, если нужно.
ну можно,а так может попробовать самому прописать?
если и тогда уже не появится - тогда есть проблема,а так мне кажется косяк разработчиков...
Код:
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.7z]
@="WinRAR"

[HKEY_CLASSES_ROOT\.7z\OpenWithProgids]

Такое есть например?А лучше так:

Код:
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.7z]
@="Applications\7zFM.exe"

[HKEY_CLASSES_ROOT\.7z\OpenWithProgids]
 
по каким хендлерам?
Так называемые обработчики.

Чтобы определить, можно ли механизму поиска искать в содержимом файлов конкретного расширения, операционная система смотрит на значение параметра раздела реестра
Код:
HKCR\«расширение файла»\PersistentHandler
. Данный параметр может принимать следующие значения:
  • {098f2470-bae0-11cd-b579-08002b30bfeb} (поиск в содержимом запрещен),
  • {5e941d80-bf96-11cd-b579-08002b30bfeb} (искать в содержимом как в обычном тексте),
  • {98de59a0-d175-11cd-a7bd-00006b827d94}(искать в содержимом как в файлах пакета Microsoft Office),
  • {eec97550-47a9-11cf-b952-00aa0051fe20} (искать в содержимом как в файлах Интернет (html-файлы, css-файлы или asp-файлы).

То есть, чтобы добавить возможность поиска в файлах с определенным расширением содержимого как в тексте, нужно создать или изменить значение параметра (по умолчанию) раздела реестра вида
Код:
HKCR\«расширение файла»\PersistentHandler
на {5e941d80-bf96-11cd-b579-08002b30bfeb}.
 
Назад
Сверху Снизу