среда, 9 сентября 2009 г.

Как Проводник определяет, поддерживает ли ваша программа длинные имена файлов?

Это перевод How does Explorer detect whether your program supports long file names? Автор: Реймонд Чен.

Когда вы регистрируете свою программу с файловой ассоциацией, оболочке нужно решить, поддерживает ли ваша программа длинные имена файлов, чтобы решить, в каком формате передавать вам имена файлов (длинные имена могут содержать пробелы! Так что убедитесь, что вы вставили кавычки вокруг "%1" при регистрации своей программы).

Правило просто: оболочка смотрит на заголовок вашего EXE файла, чтобы увидеть, что это за программа.

  • Если это 16-ти битная программа, то оболочка предполагает, что она поддерживает длинные имена файлов, если exe-файл помечен, как совместимый с Windows 95. В противном случае, оболочка предполагает, что программа не поддерживает длинные имена файлов.
  • Если это 32-х битная программа (или даже 64-х битная), тогда она считает, что программа поддерживает длинные имена файлов.
  • Если оболочка не может найти вашу программу, то она решает перестраховаться и предполагает, что ваша программа не поддерживает длинные имена файлов.

Обратите внимание на третий случай. Если вы облажаетесь при регистрации своей программы, то тогда оболочка не сможет определить, поддерживает ли ваша программа длинные имена файлов, и будет предполагать отсутствие поддержки. Тогда, если ваша программа, скажем, показывает имя файла в заголовке окна, то пользователь может увидеть какие-то страшные иероглифы вместо ожидаемого имени файла.

Наиболее частым случаем, когда люди неправильно делают регистрацию, является забывание про кавычки в самом имени программы! Например, некорректная регистрация могла бы выглядеть так:

HKEY_CLASSES_ROOT
litfile
shell
open
command
(default) = C:\Program Files\LitWare Deluxe\litware.exe "%1"

Заметьте, что пробелы в пути "C:\Program Files\Litware Deluxe\litware.exe" не были заключены в кавычки при регистрации программы. Соответственно, оболочка будет верить, что имя программы - "C:\Program", и которую она не сможет найти. Поэтому оболочка перестраховывается и предполагает, что программа не имеет поддержки длинных имён файлов.

Замечание по совместимости: как часть работы по улучшению безопасности, код оболочки, который разбирает эти строки, был изменён, чтобы находить "предполагаемый" путь программы. Это представило возможность исправить третий случай, так что оболочка смогла теперь находить программу, чтобы проверить, поддерживает ли она длинные имена файлов, охраняя, таким образом, пользователя от просмотра мешанины тильд вместо имён файлов.

А после того, как мы сделали это изменение, нам пришлось столкнуться с последствиями.

Потому что оказалось, что существуют программы, которые не просто регистрируют себя неправильно, но даже делают это намеренно, в расчёте на то, что оболочка не догадается про настоящий путь к программе и будет передавать им короткие имена файлов. Кажется, эти программы просто хотели короткие имена файлов, но не могли достичь этого другим путём, кроме этого.

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

2 комментария:

  1. Говнокодство. Но ниче, в 2013 погорит вся электроника в мире, от Солнечной вспышки.

    ОтветитьУдалить
    Ответы
    1. Не погорела... Когда следующий прогноз?

      Удалить

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.