Сменить icon у exe файла

Тема в разделе "WASM.BEGINNERS", создана пользователем ActioN, 3 июл 2005.

  1. ActioN

    ActioN New Member

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    160
    Адрес:
    Ukraine
    В WM_CREATE загружаю icon из shell32.dll и изменяю иконку приложения, которая находится в заголовке(сверху слева=), а как изменить иконку самого exe-файла таким же способом (загрузкой из dll-ки)?

    ...
    Код (Text):
    1.  invoke ExtractIconEx,addr szShell,137,0,addr hIcon,1
    2.  invoke SendMessage,hWnd,WM_SETICON,ICON_SMALL,hIcon
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Обновить иконку в ресурсе ехе.
     
  3. ActioN

    ActioN New Member

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    160
    Адрес:
    Ukraine
    А как это сделать? Раздел для новичков ... можно рабочий пример(masm) для новичка?
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    ActioN

    Тебе что, надо иконку exe поменять на shell'овскую, и ты её постоянно грузишь что-ли при запуске проги?



    Есть такая программа - AwIcons, воспользуйся ею, чтобы вынуть нужную иконку из shell32, сохрани на диск и компилируй файл ресурсов с этой иконой.
     
  5. ActioN

    ActioN New Member

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    160
    Адрес:
    Ukraine
    cresta, хочется чтобы прога минимум места занимала и поэтому извлекаю иконку из shell32.dll напрямую и гружу ее вместо значка в exe-файл. Или это не рационально(уменьшается скорость загрузки программы)?
     
  6. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Прицепить икону к файлу .exe, чтобы в проводнике отображалась именно икона из shell, можно только перекомпилив ресурсы и с новым ресурсом, содержащим иконку, перекомпилить сам .exe. По другому не получится.
     
  7. Flint

    Flint New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    42
    Спорный вопрос, что будет меньше занимать

    1. Процедура загрузки иконки.

    2. Зашитая в ресурсы.



    Я думаю лучше не извращаться,а выбрать 2ое
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Flint

    "Зашитую в ресурсы" иконку система будет вытаскивать точно так же, как и ты. Так что вопрос о времени здесь неуместен.
     
  9. Stub

    Stub New Member

    Публикаций:
    0
    Регистрация:
    11 май 2004
    Сообщения:
    311
    Адрес:
    Siberia
    Рабочий пример:

    1. С помощью Restorator'а выдираем нужную иконку из shell32.dll.

    2. Убеждаемся в том, что подопытный exe не пакован или секция его ресурсов не защищена каким-либо пакером/протектором.

    3. Если защищен, то сначала распаковываем, иначе идем дальше.

    4. Открываем с помощью все того же Restorator'а подопытный exe и меняем ему требуемую(ые) иконку(ы) на ту, которую перед этим выдрали из shell32.dll.

    5. Сохраняем все изменения и проверяем :).

    Все.

    Или мб тебе надо как такое организовать программно?
     
  10. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    программно :)
     
  11. Stub

    Stub New Member

    Публикаций:
    0
    Регистрация:
    11 май 2004
    Сообщения:
    311
    Адрес:
    Siberia
  12. Flint

    Flint New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    42
    2IceStudent Я не про время, а про объем самой иконки и процедуры вытаскивания. Что будет меньше по размеру? Ты говоришь тебе нужен маленький размер. IMHO (Не пробовал) Я думаю иконка в EXE будет меньше чем процедура вытаскивания и установки.
     
  13. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Flint

    Иконка в ресурсах занимает ГОРАЗДО больше места, чем код вызова GetModuleHandle / LoadIcon.



    Кстати, иконку можно ещё в секции данных хранить в виде 2х массивов. Например:
    Код (Text):
    1. unsigned int ANDmask[] = {
    2.    0xFFFFFFFF,0xFFFFFFFF,
    3.    0x3FFC7FFE,0x1FF81FF8,
    4.    0x7FFE3FFC,0xFFFFFFFF,
    5.    0xFFFFFFFF,0xFFFFFFFF,
    6. };
    7. unsigned int XORmask[] ={
    8.    0x00000000,0x00000000,
    9.    0x40028001,0xA005A005,
    10.    0x80014002,0x00000000,
    11.    0x00000000,0x00000000,
    12. };
    13. HICON hSmIcon;


    Потом динамически совмещаем эти массивы в одну 16х16 иконку:
    Код (Text):
    1. hSmIcon = CreateIcon(hInst,16,16,1,1,(char*)ANDmask,(char*)XORmask);


    Потом, перед завершением проги, не забудьте уничтожить иконку:
    Код (Text):
    1. DestroyIcon(hSmIcon);


    Это тоже будет меньше места занимать, чем иконка в ресурсах, но больше чем загрузка иконки из шелла.