Здравствуйте. Будет здорово, если кто-то поможет, если хорошо знаком с форматом RES-файлов. Задача проста. Есть *.ico-файл, необходимо создать res файл, в котором будет эта иконка. Имя ресурса - любое. Тип - RT_ICON.
Курить нужно http://msdn.microsoft.com/en-us/library/ms648007.aspx и, в частности, описание RESOURCEHEADER (там ссылка есть). Для иконок нужен не только ресурс RT_ICON, но и RT_GROUP_ICON. Код на макросах fasm, учитывает, что в .ico файлах бывает несколько иконок с разными разрешениями (ресурс будет один): Код (Text): iconfile equ '1.ico' iconid equ 101 dd 0, 20h dw 0xFFFF, 0 dw 0xFFFF, 0 dd 0, 0, 0, 0 virtual at 0 ; load .ico header file iconfile:0,6 load idReserved word from 0 load idType word from 2 load idCount word from 4 if (idReserved <> 0) | (idType <> 1) error invalid icon file end if end virtual repeat idCount virtual at 0 file iconfile:6+16*(%-1)+8,8 load dwBytesInRes dword from 0 load dwImageOffset dword from 4 end virtual dd dwBytesInRes, 20h dw 0xFFFF, 3 ; RT_ICON dw 0xFFFF, % dd 0 dw 1030h dw 0 dd 0 dd 0 file iconfile:dwImageOffset,dwBytesInRes while dwBytesInRes and 3 dwBytesInRes = dwBytesInRes + 1 db 0 end while end repeat dd 6 + 14*idCount, 20h dw 0xFFFF, 14 ; RT_GROUP_ICON dw 0xFFFF, iconid dd 0 dw 1030h dw 0 dd 0 dd 0 ; RT_GROUP_ICON data dw 0, 1, idCount ; idCount images repeat idCount file iconfile:6+16*(%-1),12 dw % end repeat while $ and 3 db 0 end while Added: забыл сразу написать - иконка будет экспортироваться по идентификатору iconid (в коде он 101, естественно, можно заменить на свой); для экспорта по имени нужно соответственно изменить RESOURCEHEADER для RT_GROUP_ICON.
Вообще-то приходить на изначально ассемблерный форум и просить переписать код на Си - это наглость... А что непонятного? db/dw/dd? Директива file <filename>:<offset>,<length> загружает <length> байт из файла со смещения <offset>, приколы с virtual и load имеют смысл загрузки нужных значений из файла в переменные.
Есть RESOURCEHEADER. Если тип/имя - число, то можно использовать тип struct RESOURCEHEADER { DWORD DataSize; DWORD HeaderSize; // = sizeof(RESOURCEHEADER) = 32 DWORD TYPE; // 0xFFFF | (Type << 16) DWORD NAME; // 0xFFFF | (Name << 16) DWORD DataVersion; WORD MemoryFlags; // = 0x1030 WORD LanguageId; DWORD Version; DWORD Characteristics; }; В ресурсном файле сначала идёт пустой RESOURCEHEADER, а потом RESOURCEHEADER для каждого ресурса. Собственно, непонятно: 1) сколько RESOURCEHEADER-секций создаётся для одного *.ico файла 2) причём тут RT_GROUP_ICON 3) какая(ие) часть(и) *.ico файла пишутся как Data 4) какие данные заголовка иконки берутся 5) какие заголовки кроме RESOURCEHEADER, используются для иконки
тебе дали макрос. что в нем не понятного. там все это есть. virtual at 0 говорит о том, что сгенерированный код будет располагаться в позиции 0 логического пространства, но в файл помещен не будет file iconfile:0,6 читает со смещения 0 из iconfile 6 байт и помещает их в этот блок load idReserved word from 0 берет по смещению 0 в логическом блоке 2 байта и помещает значение в переменную idReserved load idType word from 2 берет по смещению 2 в логическом блоке 2 байта и помещает значение в переменную idType load idCount word from 4 берет по смещению 4 в логическом блоке 2 байта и помещает значение в переменную idCount end virtual закрываем эту конструкцию. код пропадает, а значения переменных idReserved, idType и idCount остаются (чудом избегают уничтожения!) остальное очень похоже на СИ. Ах да. Вместо переменной счетчиком цикла, начинающим отсчет с 1, в конструкции repeat <count>/end repeat выступает % ADD: И еще чуть не забыл. $ - текущая позиция в уже сгенерированном файле (оффсет). dq=double, dd = unsigned int/int/float (по вкусу), dw = unsigned short int/short int (по вкусу), а db = unsigned char/char/bool (по вкусу) в результате автозамены получаем Код (Text): iconfile equ '1.ico' iconid equ 101 int __a=0, __b=20h short int __c=0xFFFF, __d=0 int __e=0xFFFF, __f=0 short int __g=0, __h=0, __i=0, __j=0 virtual at 0 ; load .ico header file iconfile:0,6 load idReserved word from 0 load idType word from 2 load idCount word from 4 if (idReserved <> 0) | (idType <> 1) error invalid icon file end if end virtual for (int i=1; i<=idCount; i++) { virtual at 0 file iconfile:6+16*(i-1)+8,8 load dwBytesInRes dword from 0 load dwImageOffset dword from 4 end virtual int _a=dwBytesInRes, ___b=20h short int _b=0xFFFF, ___c=3 ; RT_ICON short int _c=0xFFFF, ___d=i int _d=0 short int _e=1030h short int _f=0 int _g=0 int _h=0 file iconfile:dwImageOffset,dwBytesInRes char xx[dwBytesInRes and 3]=(0,...,0); } int a=6 + 14*idCount, 20h short int b=0xFFFF, 14 ; RT_GROUP_ICON short int c=0xFFFF, iconid int d=0 short int e=1030h short int f=0 int g=0 int h=0 ; RT_GROUP_ICON data short int idCount[3]=(0, 1, idCount) ; idCount images short int xxx[idCount] for (int i=1; i<=idCount; i++) { file iconfile:6+16*(i-1),12 xxx[i-1]=i } while $ and 3 db 0 end while ADD: а. кое-что забыл поменять.