Как ОС узнает, что делать с файлом, когда выбран параметр “Открыть с помощью ...”?
-
05-07-2019 - |
Вопрос
Объяснение:Я не помню о Linux и не знаю об OS X, но в Windows вы можете щелкнуть правой кнопкой мыши файл и выбрать программу, чтобы открыть его.Но откуда операционная система точно знает, как заставить программу открыть его?Отслеживает ли он диалоги "Открыть файл", которые есть в программе?Должен ли разработчик указывать специальный обработчик событий или что-то в этом роде для этих случаев?
Решение
Операционная система запускает указанную программу, отправляя в качестве параметра путь к файлу, который нужно открыть.
Например, в C #, если вы хотите узнать, какой файл операционная система хочет, чтобы вы открыли, вам нужно будет выполнить:
class Program
{
static void Main(string[] args)
{
if (args.Length == 1) //The OS wants me to open a file
openSomeFileJustBecauseTheOSWantsIt(args[0]);
}
}
Другие советы
Для Windows ответ находится в реестре.Если вам удобно читать реестр, запустите regedit.exe на вашем компьютере с Windows.
В разделе HKEY_CLASSES_ROOT вы увидите ключевой список всех типов файлов, .doc, .txt и т.д.Каждый из этих ключей содержит ключ с именем "OpenWithList" или "OpenWithProgids".У приложения может быть зарегистрированный "ProgID", также находящийся в разделе □, и оно может зарегистрировать свой ProgID для типов файлов, которые оно хочет обрабатывать в OpenWithProgids.В противном случае он регистрирует себя в OpenWithList.
В ответ на комментарий к первому ответу (потому что у меня недостаточно репутации, чтобы комментировать):
Вы думаете о DDE, которая является достаточно устаревшей технологией.Оболочка Windows запускает приложение с выбранным файлом в качестве первого параметра.
Проводник Windows запоминает ваши предыдущие варианты "Открыть с помощью ..." на основе расширения файла в следующем ключе:
HKCR\.ext\OpenWithList
В следующий раз, когда вы щелкните файл правой кнопкой мыши, он отобразится там и создаст список программ, которые вы ранее использовали для открытия определенного типа файлов.
Скажем, он находит ключ с именем "myapp.exe".Затем он просматривает приложение здесь:
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Applications\myapp.exe
извлекает информацию о том, где установлено приложение.И это происходит здесь:
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AppID\myapp.exe
следуйте за GUID, хранящимся там, чтобы узнать отображаемое имя приложения.
Чтобы добавить веселья, основное связанное приложение также есть в списке, а также все, что есть в OpenWithProgIds
ключ и все остальное в:
HKEY_CLASSES_ROOT\*\OpenWithList
а также их соответствующие HKEY_CURRENT_USER
аналоги.
Полученный список приложений затем становится уникальным, сортируется и отображается.При выборе файл запускается как любой другой файл, на который вы нажимаете, т.е.:
C:\path\to\myapp.exe "C:\path\to\the\file.ext"
Ассоциации файлов хранятся в реестре в:HKEY_CLASSES_ROOT HKEY_CLASSES_ROOT.
Вы можете управлять ими графически с помощью проводника Windows:(WinXP)
Выберите Инструменты / Параметры/ Типы файлов
Или с помощью апплета "Программы по умолчанию" на панели управления.(Перспектива)
Просто для некоторой ностальгии довольно блестящий Желудь архимеда имел гораздо лучшую систему, где каждый тип файла имел уникальный номер типа, с кодом производителя и приложения (скорее похожий на MAC-адрес), который был записан вместе с файлом.
Это означает, что у вас могут быть разные файлы с именем .bak, открытые правильным приложением - в отличие от случая Windows, когда новое установленное приложение присваивает права собственности на каждый завершающий работу файл этого типа.Autocad особенно плох для этого, регистрируя около 20 типов файлов.