В WM_CREATE загружаю icon из shell32.dll и изменяю иконку приложения, которая находится в заголовке(сверху слева=), а как изменить иконку самого exe-файла таким же способом (загрузкой из dll-ки)? ... Код (Text): invoke ExtractIconEx,addr szShell,137,0,addr hIcon,1 invoke SendMessage,hWnd,WM_SETICON,ICON_SMALL,hIcon
ActioN Тебе что, надо иконку exe поменять на shell'овскую, и ты её постоянно грузишь что-ли при запуске проги? Есть такая программа - AwIcons, воспользуйся ею, чтобы вынуть нужную иконку из shell32, сохрани на диск и компилируй файл ресурсов с этой иконой.
cresta, хочется чтобы прога минимум места занимала и поэтому извлекаю иконку из shell32.dll напрямую и гружу ее вместо значка в exe-файл. Или это не рационально(уменьшается скорость загрузки программы)?
Прицепить икону к файлу .exe, чтобы в проводнике отображалась именно икона из shell, можно только перекомпилив ресурсы и с новым ресурсом, содержащим иконку, перекомпилить сам .exe. По другому не получится.
Спорный вопрос, что будет меньше занимать 1. Процедура загрузки иконки. 2. Зашитая в ресурсы. Я думаю лучше не извращаться,а выбрать 2ое
Flint "Зашитую в ресурсы" иконку система будет вытаскивать точно так же, как и ты. Так что вопрос о времени здесь неуместен.
Рабочий пример: 1. С помощью Restorator'а выдираем нужную иконку из shell32.dll. 2. Убеждаемся в том, что подопытный exe не пакован или секция его ресурсов не защищена каким-либо пакером/протектором. 3. Если защищен, то сначала распаковываем, иначе идем дальше. 4. Открываем с помощью все того же Restorator'а подопытный exe и меняем ему требуемую(ые) иконку(ы) на ту, которую перед этим выдрали из shell32.dll. 5. Сохраняем все изменения и проверяем . Все. Или мб тебе надо как такое организовать программно?
2IceStudent Я не про время, а про объем самой иконки и процедуры вытаскивания. Что будет меньше по размеру? Ты говоришь тебе нужен маленький размер. IMHO (Не пробовал) Я думаю иконка в EXE будет меньше чем процедура вытаскивания и установки.
Flint Иконка в ресурсах занимает ГОРАЗДО больше места, чем код вызова GetModuleHandle / LoadIcon. Кстати, иконку можно ещё в секции данных хранить в виде 2х массивов. Например: Код (Text): unsigned int ANDmask[] = { 0xFFFFFFFF,0xFFFFFFFF, 0x3FFC7FFE,0x1FF81FF8, 0x7FFE3FFC,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF, }; unsigned int XORmask[] ={ 0x00000000,0x00000000, 0x40028001,0xA005A005, 0x80014002,0x00000000, 0x00000000,0x00000000, }; HICON hSmIcon; Потом динамически совмещаем эти массивы в одну 16х16 иконку: Код (Text): hSmIcon = CreateIcon(hInst,16,16,1,1,(char*)ANDmask,(char*)XORmask); Потом, перед завершением проги, не забудьте уничтожить иконку: Код (Text): DestroyIcon(hSmIcon); Это тоже будет меньше места занимать, чем иконка в ресурсах, но больше чем загрузка иконки из шелла.