Как найти значок по умолчанию в ресурсах исполняемого файла?

Мне нужно программно найти значок по умолчанию для исполняемого файла Windows (PE-файл = dll, exe, com ..). Я знаю, как пройтись по ресурсам и определить, что такое значок, что такое курсор и т. Д., Но, насколько мне известно, ни один из значков никоим образом не помечен как значок по умолчанию. Итак, кто-нибудь знает, как найти значок по умолчанию? Более того, я не хочу использовать какой-либо вызов API Windows, я хочу сам кодировать функцию. Проблема в том, что я не знаю, какой из всех значков является значком по умолчанию.


person PeterK    schedule 17.07.2010    source источник


Ответы (2)


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

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


Когда система отображает значок, она должна извлечь соответствующее изображение значка из файла .exe или .dll. Система использует следующие шаги для выбора изображения значка:

  1. Выберите ресурс RT_GROUP_ICON. Если существует более одного такого ресурса, система использует первый ресурс, указанный в сценарии ресурса.

    • Выберите соответствующее изображение RT_ICON из ресурса RT_GROUP_ICON. Если существует более одного изображения, система использует следующие критерии для выбора изображения:

    • Выбирается изображение, наиболее близкое к запрошенному размеру.

    • Если присутствуют два или более изображения такого размера, выбирается то, которое соответствует глубине цвета дисплея.

    • Если нет изображений, точно соответствующих глубине цвета дисплея, выбирается изображение с наибольшей глубиной цвета, не превышающей глубину цвета дисплея. Если все цвета превышают глубину цвета, выбирается тот, у которого самая низкая глубина цвета.

Примечание. Система рассматривает все значения глубины цвета 8 и более бит на пиксель как равные. Следовательно, нет преимущества включения 256-цветного изображения 16x16 и 16-цветного изображения 16x16 в один и тот же ресурс - система просто выберет первое, с которым столкнется. Когда дисплей находится в режиме 8-бит на пиксель, система выберет 16-цветной значок вместо 256-цветного и отобразит все значки с использованием палитры по умолчанию.


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

РЕДАКТИРОВАТЬ: небольшое исправление. Значок размером меньше 16x16, очевидно, может находиться в ресурсах, но это указывает на то, что файл не имеет значка по умолчанию, и система вместо этого предоставляет свой собственный значок.

person PeterK    schedule 17.07.2010

Первый, который вы найдете, будет выбран по умолчанию.

Значок по умолчанию - это просто значок с наименьшим идентификатором, поэтому по определению это первый значок, обнаруженный при перечислении ресурсов.

person Chris Becke    schedule 17.07.2010
comment
Подскажите, пожалуйста, где вы нашли эту информацию? Я пробовал гуглить, но не нашел ничего подходящего. - person PeterK; 17.07.2010
comment
+1, это правильно. Вы можете найти его здесь: stackoverflow.com/questions/3270757/ - person Hans Passant; 17.07.2010
comment
В том же месте, что и ты. Конечно, я интерпретирую ICON_GROUP как значок, поскольку группа значков представляет собой набор изображений отдельных устройств в исходном значке (файл ico). Таким образом, я поддерживаю свое требование - первый найденный значок является значком по умолчанию. И это будет, как правило, тот, у которого самый низкий идентификатор, поскольку большинство редакторов ресурсов сначала будут структурировать файл ресурсов с низким идентификатором. - person Chris Becke; 17.07.2010
comment
технически вы правы, к сожалению, предположение, что значок с наименьшим идентификатором будет значком по умолчанию, для меня недостаточно (по причинам, см. здесь: microsoft.com/technet/security/bulletin/ms05-002.mspx). В любом случае спасибо за ответ! - person PeterK; 18.07.2010