Весм привет! Помогите разобраться с ресурсами. Вобщем, такая ситуация: Мне нужно программно(програ 1) изменить Иконку программы 2. В MSDN я узнал, что нужно это делается посредствам функций BeginUpDateResource,UpDateResource... Но проблема в том, что я нимогу никак понять чтоза тип такой RT_ICON_GROUP и как мне его заменить. Также требуется замена иконки из файл .ico Зарание спасибо.
Так, с этим я уже более мение зазобрался, но теперь появились другие вопросы: Как заставить MASM понимать DWORD, как указатель на структуру? И есть ли в масме MakeIntResource макрос. Где его взять?
Т.к. в ассемблере (по крайней мере в масме) нет чёткого разграничения по типам (основные типы: BYTE WORD DWORD), всё в конечном итогое сводится к ним. Т.е. к примеру LPVOID = DWORD, LPSTR = DWORD, HANDLE = DWORD и т.д. А это значит, что можно спокойно писать: Код (Text): lpstruct dd ? ... mov eax, offset <СТРУКТУРА> mov lpstruct, eax ... invoke <процедура>,lpstruct а MAKEINTRESOURCE в масме не нужен. Можно спокойно написать, к примеру, Код (Text): ID_DIALOG equ 100 ... invoke DialogBoxParam,hInst,ID_DIALOG,NULL,addr DlgProc,NULL и всё будет работать. P.S. прошу сильно не пинать, если что не так.
Насчёт структур: Но ведь масм не будет понимать к примеру struct.Id ? Это нужно по смещениям работать, т.е mov eax,DWORD ptr[strukt+4]?
Народ срочно помогите пожалуйста!!! Уже мозги плавятся... Вобщем ситуация теперь такая. В 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) Что я делаю не так???
Angel01 Насчёт структур: Но ведь масм не будет понимать к примеру struct.Id ? Это нужно по смещениям работать, т.е mov eax,DWORD ptr[strukt+4]? попробуй так: Код (Text): MYSTRUCT struct A1 dd ? Id dd ? ends .data? Tmp1 MYSTRUCT<> или LOCAL Tmp1:MYSTRUCT mov eax, Tmp1.Id другой вариант: assume eax : ptr MYSTRUCT mov eax,pMem mov edx,[eax].Id ... ... assume eax : nothing
после обработки структуры прибавляй к текущему указателю на структуру её (структуры) размер: add eax, sizeof MYSCTRUCT т.о. ты переходишь к след эл-ту структуры
глянь ExtractIcon - исходник в спартанском стиле, но зато работает (на WinXP SP2) взято с AsmFr 2051328189__ExtractIcon.zip
Такой вопрос назрел. Похож на этот топик. Есть файл 1 и файл 2. Иконку из файла 1 надо поставить на файл 2. Решил сделать так: Пробовал и через ExtractAssociatedIcon и через SHGetFileInfo. Но хэндлы которые они возвращают в SizeofResource почему то не проходят. У кого то есть рабочий пример кода, что бы сравнить и найти у себя ошибку. Или может есть какой то простой способ легко и без замарочек это сделать. Примечание: в файле 2 кроме иконки лежать ничего не должно в ресурсах.
Естесственно, объекты разные. Чтобы сохранить иконку из HICON возни побольше, чем с сохранением битмапа, т.к. нужно перебрать все форматы иконки, отрисовать их в память, получить битмапы из памяти и сохранить их в формате иконки в ресурсы, раскидав по форматам иконки и заполнив RT_ICON_GROUP.