RT_ICON_GROUP и работа с ним.

Тема в разделе "WASM.WIN32", создана пользователем Angel01, 20 янв 2006.

  1. Angel01

    Angel01 New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2005
    Сообщения:
    16
    Адрес:
    от туда...
    Весм привет! Помогите разобраться с ресурсами. Вобщем, такая ситуация:

    Мне нужно программно(програ 1) изменить Иконку программы 2.

    В MSDN я узнал, что нужно это делается посредствам функций BeginUpDateResource,UpDateResource...

    Но проблема в том, что я нимогу никак понять чтоза тип такой RT_ICON_GROUP и как мне его заменить.

    Также требуется замена иконки из файл .ico

    Зарание спасибо.
     
  2. Angel01

    Angel01 New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2005
    Сообщения:
    16
    Адрес:
    от туда...
    Так, с этим я уже более мение зазобрался, но теперь появились другие вопросы: Как заставить MASM понимать DWORD, как указатель на структуру?

    И есть ли в масме MakeIntResource макрос. Где его взять?
     
  3. DPX

    DPX New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2005
    Сообщения:
    47
    Адрес:
    Russia
    Т.к. в ассемблере (по крайней мере в масме) нет чёткого разграничения по типам (основные типы: BYTE WORD DWORD), всё в конечном итогое сводится к ним. Т.е. к примеру LPVOID = DWORD, LPSTR = DWORD, HANDLE = DWORD и т.д. А это значит, что можно спокойно писать:
    Код (Text):
    1.  
    2. lpstruct dd ?
    3. ...
    4. mov eax, offset <СТРУКТУРА>
    5. mov lpstruct, eax
    6. ...
    7. invoke <процедура>,lpstruct
    8.  




    а MAKEINTRESOURCE в масме не нужен. Можно спокойно написать, к примеру,
    Код (Text):
    1.  
    2. ID_DIALOG equ 100
    3. ...
    4. invoke DialogBoxParam,hInst,ID_DIALOG,NULL,addr DlgProc,NULL
    5.  


    и всё будет работать.

    P.S. прошу сильно не пинать, если что не так. :)
     
  4. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    DPX, пинать не за что, т.к. всё верно сказано
     
  5. Angel01

    Angel01 New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2005
    Сообщения:
    16
    Адрес:
    от туда...
    Насчёт структур: Но ведь масм не будет понимать к примеру struct.Id ?

    Это нужно по смещениям работать, т.е mov eax,DWORD ptr[strukt+4]?
     
  6. Angel01

    Angel01 New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2005
    Сообщения:
    16
    Адрес:
    от туда...
    Народ срочно помогите пожалуйста!!!

    Уже мозги плавятся... Вобщем ситуация теперь такая.

    В MSDN я вычитал, что начало файла (ICO) - это структура:

    typedef struct

    {

    WORD idReserved; // Reserved (must be 0)

    WORD idType; // Resource Type (1 for icons)

    WORD idCount; // How many images?

    ICONDIRENTRY idEntries[1]; // An entry for each image (idCount of 'em)

    } ICONDIR, *LPICONDIR;

    Первый DWORD из idEntries, это смещение(относительно чего не сказанно) на данные иконки. также там сказанно, что начало данных иконки - это тоже структура ICONDIRENTRY:

    typedef struct

    {

    BYTE bWidth; // Width, in pixels, of the image

    BYTE bHeight; // Height, in pixels, of the image

    BYTE bColorCount; // Number of colors in image (0 if >=8bpp)

    BYTE bReserved; // Reserved ( must be 0)

    WORD wPlanes; // Color Planes

    WORD wBitCount; // Bits per pixel

    DWORD dwBytesInRes; // How many bytes in this resource?

    DWORD dwImageOffset; // Where in the file is this image?

    } ICONDIRENTRY, *LPICONDIRENTRY;

    НО когда я пытаюсь получить размер иконки:

    mov eax,pMem; указатель на место куда я прочитал файл

    mov ebx,DWORD ptr[eax+6];Получаю смешение на данные иконки

    mov edx,DWORD ptr[eax+ebx+0Ch]

    Я получаю какую то белеберду(размер=-1437663140)

    Что я делаю не так???
     
  7. krokus

    krokus New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2005
    Сообщения:
    11
    Адрес:
    Ukraine
    Angel01



    Насчёт структур: Но ведь масм не будет понимать к примеру struct.Id ?

    Это нужно по смещениям работать, т.е mov eax,DWORD ptr[strukt+4]?




    попробуй так:


    Код (Text):
    1.  
    2. MYSTRUCT struct
    3. A1   dd ?
    4. Id   dd ?
    5. ends
    6.  
    7. .data?
    8. Tmp1 MYSTRUCT<>
    9. или
    10. LOCAL Tmp1:MYSTRUCT
    11.  
    12. mov eax, Tmp1.Id
    13.  
    14. другой вариант:
    15.  
    16. assume eax : ptr MYSTRUCT
    17. mov eax,pMem
    18. mov edx,[eax].Id
    19. ...
    20. ...
    21. assume eax : nothing
    22.  
     
  8. Angel01

    Angel01 New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2005
    Сообщения:
    16
    Адрес:
    от туда...
    Второй вариант рулит!!! А я и не знал...
     
  9. Angel01

    Angel01 New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2005
    Сообщения:
    16
    Адрес:
    от туда...
    а как можно объяснить масму, что это не одна структура, а массив структур?
     
  10. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    после обработки структуры прибавляй к текущему указателю на структуру её (структуры) размер:



    add eax, sizeof MYSCTRUCT



    т.о. ты переходишь к след эл-ту структуры
     
  11. Angel01

    Angel01 New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2005
    Сообщения:
    16
    Адрес:
    от туда...
    Нет, тут токое дело в структуре, находиться масив структур, причём размер массива на фиксированный
     
  12. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    глянь ExtractIcon - исходник в спартанском стиле, но зато работает (на WinXP SP2)

    взято с AsmFr

    [​IMG] 2051328189__ExtractIcon.zip
     
  13. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    Такой вопрос назрел. Похож на этот топик. Есть файл 1 и файл 2. Иконку из файла 1 надо поставить на файл 2. Решил сделать так:
    Пробовал и через ExtractAssociatedIcon и через SHGetFileInfo.
    Но хэндлы которые они возвращают в SizeofResource почему то не проходят.
    У кого то есть рабочий пример кода, что бы сравнить и найти у себя ошибку.

    Или может есть какой то простой способ легко и без замарочек это сделать.
    Примечание:
    в файле 2 кроме иконки лежать ничего не должно в ресурсах.
     
  14. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    dead_body
    Я выкладывал на форуме именно такой исходник (100%). В поиск.
     
  15. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    censored
    перелапатил 20 страниц с темами и не нашел. Хоть примерное название темы помнишь?
     
  16. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Естесственно, объекты разные. Чтобы сохранить иконку из HICON возни побольше, чем с сохранением битмапа, т.к. нужно перебрать все форматы иконки, отрисовать их в память, получить битмапы из памяти и сохранить их в формате иконки в ресурсы, раскидав по форматам иконки и заполнив RT_ICON_GROUP.