5

До сих пор я знаю контекстное меню отображения Windows, основанное на расширении файла, а не на типе файла. Я только что проверил с пустым текстовым файлом с расширением mp3 с winamp, и результат ниже:

Контекстное меню Winamp

Точно так же, как я тестирую пустой файл с расширением exe и Windows выдает мне контекстное меню типа "Запуск от имени администратора" и так далее. Контекстное меню исполняемого файла

Но если я создаю sfx-архив с тем же расширением exe, как Windows дает мне другой значок, а WinRAR - специальное контекстное меню, например "Извлечь здесь", как показано на рисунке ниже?

SFX контекстное меню

Мой вопрос: либо заголовок файла для читателей Windows и представляет соответствующие данные, либо WinRAR имеет какую-либо специальную схему обнаружения файлов? Я сомневаюсь, что второй, так как при создании контекстного меню WinRAR не вызывался.

Другой вопрос: если из-за поведения Windows при чтении заголовков (например, при создании эскизов для картинок или видео) расширение теперь имеет меньшее значение? Разве они не имеют никакого влияния в контекстном меню?

2 ответа2

6

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

Цитата из этого отрывка книги по программированию оболочки Visual Basic:

Динамические контекстные меню

Статические контекстные меню ограничены, потому что они одинаковы для каждого файлового объекта данного типа. Кроме того, количество файлов, которые могут быть обработаны через статическое меню, ограничено программой, которая используется для выполнения команды. Что делать, если вам нужно обработать 20 файлов? Что делать, если вам нужны разные параметры обработки в зависимости от состояния самого файла? Есть также ситуации, когда вам может понадобиться одно контекстное меню для группы файлов и другое для одного файла. Это где динамические контекстные меню вступают в игру.

...

Вы можете захотеть отображать разные пункты меню в зависимости от того, был ли выбран один или несколько файлов. Поскольку количество выбранных файлов может быть определено в IShellExtInit::Initialize, это становится тривиальным вопросом. У вас также есть возможность основывать пункт меню на самом файле. В дополнение к количеству выбранных файлов вы также уже знаете имена файлов. Это означает, что вы можете открыть файл, получить информацию и основать пункт меню на реальных данных. Или вы можете изучить какой-либо другой атрибут файла (например, дату его создания, его размер или статус «только для чтения») и основать пункт меню на этой информации.

Наконец, если вы хотите доказать, что файл действительно читается DLL расширения оболочки WinRAR (так как вы, похоже, сомневаетесь в этом), вот различные вызовы ReadFile, зарегистрированные Process Monitor при простом щелчке правой кнопкой мыши WinRAR SFX:

1

(Имя процесса отображается как explorer.exe, а не rarext.dll, потому что обработчик контекстного меню является «внутрипроцессным» COM-объектом, который оболочка загружает непосредственно в область памяти explorer.exe для выполнения.)

Как видите, он читает первые 7 байтов, чтобы подтвердить, что это EXE:

2

После прочтения дополнительных данных (без сомнения, для получения и анализа заголовка), он читает 7 байтов из смещения 101 376, чтобы подтвердить, что это WinRAR SFX, а не просто какой-либо старый EXE:

3

Это побуждает его добавлять различные пункты контекстного меню, такие как Open with WinRAR, Extract with WinRAR и т.д., Которые не добавляются для "обычных" EXE-файлов.

Кроме того, в диалоге настроек WinRAR есть опция « Где проверять SFX-архивы»:

4

Вот что говорит об этом файл справки:

Параметры «Где проверить SFX-архивы» управляют обработкой SFX-архивов в контекстных меню. Проверка содержимого исполняемого файла и определение, является ли он самораспаковывающимся (SFX) архивом, приводит к некоторой задержке при щелчке правой кнопкой мыши по каждому файлу «.exe», поскольку WinRAR необходимо прочитать и проанализировать данные файла, чтобы выяснить, является ли он SFX. Хотя такая задержка незначительна для быстрых локальных жестких дисков, она может быть заметна в случае медленных сетевых дисков. Эта группа опций позволяет включать или отключать обработку SFX для локальных жестких дисков, сетевых дисков и других дисков, таких как CD-ROM и USB, отдельно. Если вы отключите эти параметры, вы не увидите все элементы контекстного меню, связанные с SFX, при щелчке правой кнопкой мыши по архиву SFX. Поэтому отключайте эти параметры, только если вы действительно испытываете задержки при щелчке правой кнопкой мыши по файлам «.exe».

Надеюсь, что это заставит ваши сомнения отдохнуть. :) Что касается вашего второго вопроса о том, имеют ли расширения "меньшее значение" сейчас и не имеют «какого-либо влияния в контекстном меню [s]», я не понимаю, что вы имеете в виду. Даже миниатюры изображений / видео генерируются обработчиками расширения оболочки (DLL). Список различных обработчиков можно найти здесь. Как видите, можно иметь собственные обработчики расширений оболочки для всего: от контекстных меню, операций перетаскивания, значков, наложения значков, списков свойств, миниатюр, информационных подсказок, метаданных, столбцов Explorer, диалоговых окон копирования / перемещения / удаления / переименования. , поиск ...

Редактировать: По совпадению, Рэймонд Чен случайно опубликовал статью о расширениях оболочки и сегодня (не забудьте также прочитать предыдущую ).

0

Проводник 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 , если расширение файла найдено, запустить назначенные обработчики файлов.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .