О Windows из первых рукВремя 16-разрядных значков уже прошло

Рэймонд Чен (Raymond Chen)

Как было отмечено в статье из рубрики «О Windows из первых рук» в номере за февраль 2008 г., из операционной системы Windows® исчезают некоторые функции. Обычно это происходит медленно и почти незаметно, а команда разработчиков каждый раз тихо празднует такое событие. Еще одна функция, не попавшая в операционную систему Windows Vista® - возможность доступа 32-разрядного кода к значкам, сохраненным в 16-разрядных модулях (по большей части в 16-разрядных EXE-файлах и библиотеках DLL).

Пока вы приводите все свои системы в соответствие с этим, помните о том, что 16-разрядный код по-прежнему имеет доступ к значкам, сохраненным в 16-разрядных модулях; все процессы происходят в 16-разрядном слое эмуляции. Пропала только возможность доступа к этим значкам из 32-разрядного кода, если более точно, возможность функций извлечения 32-разрядных значков, например, ExtractIcon, загружать эти значки из 16- разрядных библиотек DLL.

32-разрядный код, извлекающий значки из 16-разрядных модулей, не пользуется преимуществами функций ядра, например, FindResource, для поиска значков в файле. Вместо этого в коде должен реализовываться собственный мини-загрузчик, который анализирует заголовок 16-разрядного модуля, выполняет поиск таблицы ресурсов, а затем анализирует ее, чтобы найти нужные ресурсы значков. Только после выполнения всех этих операций 32-разрядный код преобразует пиксели в значок.

  (Щелкните изображение, чтобы увеличить его)

Как вы можете представить, выполняющий этот процесс код очень старый и несовершенный. Существует множество возможностей возникновения ошибок при анализе двоичных файлов, случайно или умышленно. Отдел производительности запросит изменение способа открытия файлов для улучшения производительности сетей, поскольку различные режимы открытия и совместного доступа имеют различные последствия эффектов кэширования сети. А специалисты, отвечающие за обеспечение надежности, могут запросить переписать код анализа, чтобы не использовать размещенные в памяти файлы. В конечном итоге стоимость обслуживания подобного кода начинает превышать предоставляемую ценность. Я имею в виду, разве кто-нибудь еще пишет 16-разрядные программы, так ведь?

Сейчас работа ваших 16-разрядных программ зависит исключительно от наличия 16-разрядного слоя эмуляции. (Да, в 64-разрядных версиях Windows Vista отсутствует 16- разрядный слой эмуляции, но это не шаг назад по сравнению с Windows XP; в 64-разрядных версиях Windows XP тоже нет 16-разрядного слоя эмуляции. Отсутствуют улучшения, но и ухудшения тоже.)

В Windows Vista теряется только одна возможность – выполнение функции ExtractIcon для 32-разрядных программ и получение значков из 16-разрядных библиотек DLL. Если в меню «Пуск» присутствует ярлык для 16-разрядной программы, теперь значок этого ярлыка будет выглядеть как общий значок программ, поскольку проводник Windows Explorer больше не может извлекать значки 16-разрядных программ из главного EXE-файла. Не большая потеря. Но если это вас настолько беспокоит, можно изменить свойства ярлыка и указать значок из 32-разрядного модуля.

Единственное, где эта утраченная функция, как мне кажется, создает проблемы, это библиотеки значков, созданные одним конкретным средством редактирования значков. По некоторым причинам по умолчанию программа сохраняет значки как ресурсы в 16-разрядных библиотеках DLL, что означает, что доступ к этим значкам из 32-разрядного кода более недоступен. Простым решением проблемы, конечно же, является повторное сохранение этих библиотек значков как ресурсов в 32-разрядных библиотеках DLL.

Я уверен, что в конечном счете будет написана (если еще не написана) простая программа для извлечения всех значков из 16-разрядной библиотеки DLL и создания 32-разрядной библиотеки ресурсов DLL с этими значками, чтобы люди, имеющие старые значки в 16- разрядных библиотеках DLL, смогли использовать их в ярлыках меню «Пуск». Но я должен предупредить, что если вы напишите такую программу, то, скорее всего, не найдете людей, которым она действительно нужна. Количество запросов подобной программы, полученное группой пользовательского интерфейса Windows: ноль.

**Рэймонд Чен (Raymond Chen)**на своем веб-узле The Old New Thing (Хорошо забытое старое) и в одноименной книге (издательство Addison-Wesley, 2007 г.) рассказывает об истории развития Windows и касается вопросов программирования в среде Win32. Он не пытается успеть попасть в закрывающиеся двери.

© 2008 Корпорация Майкрософт и компания CMP Media, LLC. Все права защищены; полное или частичное воспроизведение без разрешения запрещено.