Контекстное меню WinRAR и определение типа файлов Windows
До сих пор я знаю контекстное меню отображения Windows, основанное на расширении файла, а не на типе файла. Я только что проверил с пустым текстовым файлом с расширением mp3 с winamp, и результат ниже:
Точно так же, как я тестирую пустой файл с расширением exe и Windows выдает мне контекстное меню типа "Запуск от имени администратора" и так далее.
Но если я создаю sfx-архив с тем же расширением exe, как Windows дает мне другой значок, а WinRAR - специальное контекстное меню, например "Извлечь здесь", как показано на рисунке ниже?
Мой вопрос: либо заголовок файла для читателей Windows и представляет соответствующие данные, либо у WinRAR есть какая-то особая схема обнаружения файлов? Я сомневаюсь, что второй, так как при создании контекстного меню WinRAR не вызывался.
Другой вопрос: если из-за поведения Windows читать заголовки (например, создавать миниатюры для картинок или видео), расширение теперь имеет меньшее значение? Разве они не имеют никакого влияния в контекстном меню?
2 ответа
Обработчики контекстного меню Windows могут быть как статическими, так и динамическими. Если вам интересно углубиться в это, я советую вам прочитать статью о контекстных меню и контекстных меню, особенно о выборе статического или динамического метода контекстного меню и настройке контекстного меню с использованием динамических глаголов.
Цитата из этого отрывка книги по программированию оболочки Visual Basic:
Динамические контекстные меню
Статические контекстные меню ограничены, потому что они одинаковы для каждого файлового объекта данного типа. Кроме того, количество файлов, которые могут быть обработаны через статическое меню, ограничено программой, которая используется для выполнения команды. Что делать, если вам нужно обработать 20 файлов? Что делать, если вам нужны разные параметры обработки в зависимости от состояния самого файла? Есть также ситуации, когда вам может понадобиться одно контекстное меню для группы файлов и другое для одного файла. Это где динамические контекстные меню вступают в игру.
...
Вы можете захотеть отображать разные пункты меню в зависимости от того, был ли выбран один или несколько файлов. Поскольку количество выбранных файлов может быть определено в IShellExtInit::Initialize, это становится тривиальным вопросом. У вас также есть возможность основывать пункт меню на самом файле. В дополнение к количеству выбранных файлов вы также уже знаете имена файлов. Это означает, что вы можете открыть файл, получить информацию и основать пункт меню на реальных данных. Или вы можете изучить какой-либо другой атрибут файла (например, дату его создания, его размер или статус "только для чтения") и основать пункт меню на этой информации.
Наконец, если вы хотите доказать, что файл действительно читается DLL расширения оболочки WinRAR (так как вы, похоже, сомневаетесь в этом), вот различные вызовы ReadFile, зарегистрированные Process Monitor при простом щелчке правой кнопкой мыши WinRAR SFX:
(Имя процесса отображается как explorer.exe, а не rarext.dll, поскольку обработчик контекстного меню является COM-объектом "в процессе", который оболочка загружает непосредственно в область памяти explorer.exe для выполнения.)
Как видите, он читает первые 7 байтов, чтобы подтвердить, что это EXE:
После прочтения дополнительных данных (без сомнения, для получения и анализа заголовка), он считывает 7 байтов из смещения 101 376, чтобы подтвердить, что это WinRAR SFX, а не просто какой-либо старый EXE:
Это побуждает его добавлять различные пункты контекстного меню, такие как Open with WinRAR, Extract with WinRAR и т. Д., Которые не добавляются для "обычных" EXE-файлов.
Кроме того, в диалоге настроек WinRAR есть опция " Где проверять SFX-архивы":
Вот что говорит об этом файл справки:
Опции "Где проверять SFX-архивы" управляют обработкой SFX-архивов в контекстных меню. Проверка содержимого исполняемого файла и определение, является ли он самораспаковывающимся (SFX) архивом, приводит к некоторой задержке при щелчке правой кнопкой мыши по каждому файлу ".exe", поскольку WinRAR необходимо прочитать и проанализировать данные файла, чтобы выяснить, является ли он SFX. Хотя такая задержка незначительна для быстрых локальных жестких дисков, она может быть заметна в случае медленных сетевых дисков. Эта группа опций позволяет включать или отключать обработку SFX для локальных жестких дисков, сетевых дисков и других дисков, таких как CD-ROM и USB, отдельно. Если вы отключите эти параметры, вы не увидите все элементы контекстного меню, связанные с SFX, при щелчке правой кнопкой мыши по архиву SFX. Поэтому отключайте эти параметры только в том случае, если вы действительно испытываете задержки при щелчке правой кнопкой мыши по файлам ".exe".
Надеюсь, что это заставит ваши сомнения отдохнуть.:) Что касается вашего второго вопроса о том, имеют ли расширения "меньшее значение" сейчас и не имеют "какого-либо влияния в контекстном меню [s]", я не понимаю, что вы имеете в виду. Даже миниатюры изображений / видео создаются обработчиками расширения оболочки (DLL). Список различных обработчиков можно найти здесь. Как видите, можно иметь собственные обработчики расширений оболочки для всего: от контекстных меню, операций перетаскивания, значков, наложения значков, списков свойств, миниатюр, информационных подсказок, метаданных, столбцов Explorer, диалоговых окон копирования / перемещения / удаления / переименования., поиск...
Редактировать: По совпадению, Рэймонд Чен случайно опубликовал статью о расширениях оболочки и сегодня (не забудьте прочитать предыдущую тоже).
Проводник Windows не читает заголовки.
Изначально сформированные меню для любого расширения основаны на ключах реестра, их можно считать ключами запуска для проводника Windows:
HKLM\SOFTWARE\Classes\Protocols\Filter
HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\ShellExecuteHooks
HKLM\Software\Classes\*\ShellEx\ContextMenuHandlers
HKLM\Software\Classes\Directory\ShellEx\ContextMenuHandlers
HKLM\Software\Classes\Directory\Shellex\DragDropHandlers
HKLM\Software\Wow6432Node\Classes\Directory\Shellex\DragDropHandlers
HKLM\Software\Classes\Directory\Shellex\CopyHookHandlers
HKLM\Software\Classes\Directory\Background\ShellEx\ContextMenuHandlers
HKLM\Software\Classes\Folder\Shellex\ColumnHandlers
HKLM\Software\Wow6432Node\Classes\Folder\Shellex\ColumnHandlers
HKLM\Software\Classes\Folder\ShellEx\ContextMenuHandlers
HKLM\Software\Classes\Folder\ShellEx\DragDropHandlers
HKLM\Software\Classes\Folder\ShellEx\PropertySheetHandlers
HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers
HKLM\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers
HKCU\Software\Classes\*\ShellEx\ContextMenuHandlers
HKCU\Software\Classes\Directory\Background\ShellEx\ContextMenuHandlers
Есть поиск по расширению файла в HKEY_LOCAL_MACHINE\Software\Classes
а также HKEY_CURRENT_USER\Software\Classes
, если расширение файла найдено, запустите назначенные обработчики файлов.