Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 20.02.2014, 19:56   #1
STRELOK-2007
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 144
Вопрос Запись данных об иконке в ресурсы PE файлов

Приветствую!

Все таки разобрался, как устроены ресурсы, отвечающие за иконку в PE файлах. Параллельно понял устройство и *.ico файлов, ибо это практически одно и то-же. Разница в 2 байтах заголовка сущности.

Это RT_GROUP_ICON с именем `MAINICON` и один или несколько ресурсов RT_ICON с целочисленным именем, скажем от 1 до n.

Сделал свой класс. Который, идеально читает как *.ico файл, так и PE. Отображает количество сущностей, данные и т.д.

Идеально сохраняет в *.ico файл, с любым количеством сущностей. Хоть 1, хоть 10.
Контрольная сумма совпадает полностью, с оригинальной *.ico иконкой (которую, я потом поместил в PE-Донора, при компилляции).

Вот с сохранением в ресурсы PE, собственно ради чего все это и писалось, проблема. Да будь одна неладна...

Иконку из одной сущности, маленького размера, взятая либо с другого PE файла, либо с иконки - записывает.

Иконку из 10 сущностей, красивую, Vista Ready... Не записывает.
ResourceHacker отказывается показывать RT_GROUP_ICON и RT_ICON с 6 по 10.
При этом, если не записывать иконки - ресурс RT_GROUP_ICON записывается отлично, побайтно (все контрольные суммы совпадают) равен аналогичному ресурсу в PE-Доноре иконке.
При этом, иконки с 1 по 5 - записываются хорошо, правда не дошли руки проверить контрольные суммы.

Собственно код:
Второй вариант, первый был запутанный, вызывающий общие процедуры, использующиеся при сохранении в *.ico файл, и работающие 100% в том случае.

Код:
procedure TdsIconResource.SaveToResource(aFileName: WideString; aLanguage: LANGID);
var
 mainheader: TdsIconHeader;
 entityheader: TdsIconEntityHeader;
 entityid: Word;

 aStream: TMemoryStream;

 hUpdate: THandle;

 i: Integer;

 entity: TdsIconResourceEntity;

 procedure SpecialWrite(const Buffer; Count: Longint);
 var
  Writed: LongInt;
 begin
  Writed:=aStream.Write(Buffer, Count);

  if Writed <> Count then
   raise Exception.Create(Format('Writed fail, %d\%d', [writed, count]));
 end;
begin
 hUpdate:=BeginUpdateResourceW(PWideChar(aFileName), False);

 aStream:=TMemoryStream.Create;

 mainheader.wReserved:=0;
 mainheader.wType:=FType;
 mainheader.wCount:=FCount;

 SpecialWrite(mainheader, SdsIconHeader);

 for I := 0 to FCount - 1 do
  begin
   entity:=TdsIconResourceEntity(FEntities.Objects[i]);

   entityheader.bWidth:=entity.FWidth;
   entityheader.bHeight:=entity.FHeight;
   entityheader.bColorCount:=entity.FColorCount;
   entityheader.bReserved:=0;
   entityheader.wPlanes:=entity.FPlanes;
   entityheader.wBitCount:=entity.FBitCount;
   entityheader.dwBytesInRes:=entity.FData.Size;

   SpecialWrite(entityheader, SdsIconEntityHeader);

   entityid:=i+1;

   SpecialWrite(entityid, SizeOf(Word));

   entity.FData.Position:=0;

   if not UpdateResourceW(hUpdate, RT_ICON, MAKEINTRESOURCE(entityid), aLanguage, entity.FData.Memory, entity.FData.Size) then
    raise Exception.Create('not UpdateResourceW~Icon~, '+IntToStr(GetLastError));
  end;

 aStream.Position:=0;

 if not UpdateResourceW(hUpdate, RT_GROUP_ICON, 'MAINICON', aLanguage, aStream.Memory, aStream.Size) then
  raise Exception.Create('not UpdateResourceW~Group~, '+IntToStr(GetLastError));

 if not EndUpdateResourceW(hUpdate, False) then
  raise Exception.Create('not EndUpdateResourceW, '+IntToStr(GetLastError));

 FreeAndNil(aStream);
end;
В чем может быть проблема?
Ошибок никаких не возникает, значит все функции возвращают истину!

Есть ли какие то ограничения у BeginUpdateResource, UpdateResource, EndUpdateResource?
Я ведь понимаю правильно, что можно UpdateResource - вызывать столько раз, сколько нужно?
Пробовал каждый раз вызывать эту "святую троицу", так вообще - все ресурсы затерлись к чертовой бабушке! Были только иконки с 6 по 10!
(Что кстати странно...)
STRELOK-2007 вне форума
Старый 21.02.2014, 09:07   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А вторую тему зачем создавать?
Неужели нельзя в свою старую писать?
I'm learning to live...
Stilet вне форума
Старый 21.02.2014, 09:26   #3
STRELOK-2007
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 144
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А вторую тему зачем создавать?
Неужели нельзя в свою старую писать?
Так тема разная, хотя и из одной области. В той я спрашивал КАК обновить, в этой - ПОЧЕМУ не обновляет нормально.

И ту тему один тролль зафлудил.
3 страницы, и ни одного дельного, проливающего свет на ответ на вопрос сообщения не было. Все нашел в итоге сам, статью на MSDN и тему на одном буржуйском форуме.
Полностью понял как все устроено, и начал писать код. Написал, как уже говорил - на чтение работает отлично, на запись - наполовину, причем на ту - которая особо не нужна.

Последний раз редактировалось STRELOK-2007; 21.02.2014 в 09:33.
STRELOK-2007 вне форума
Старый 21.02.2014, 11:56   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ясно. Ладно. Только из-за несдержанности доктора оставлю єту тему.
От себя добавлю, что у меня никогда не получалось подружиться с этими функциями тоже, в основном нарывался на ошибку, где писалось что ОС их не поддерживает.
I'm learning to live...
Stilet вне форума
Старый 21.02.2014, 12:01   #5
STRELOK-2007
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 144
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ясно. Ладно. Только из-за несдержанности доктора оставлю єту тему.
От себя добавлю, что у меня никогда не получалось подружиться с этими функциями тоже, в основном нарывался на ошибку, где писалось что ОС их не поддерживает.
Так вроде как с Windows 2000 они присутствовать должны. Во всяком случае в MSDN так написано.
STRELOK-2007 вне форума
Старый 21.02.2014, 13:09   #6
STRELOK-2007
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 144
По умолчанию

Этот
Код тоже не работает, поведение ровным счетом такое-же как и у меня. Разница лишь в том, что там ресурсы RT_ICO начинаются с 0.

Что-же делать, как-же быть...
STRELOK-2007 вне форума
Старый 21.02.2014, 13:34   #7
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Только из-за несдержанности доктора оставлю єту тему
И какого опять меня цепляем? Скучно стало??? Я не собирался тут ни чего писать. Нет надо зацепить, да???
doktor255 вне форума
Старый 21.02.2014, 13:47   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Я не собирался тут ни чего писать.
Да? И что же тогда тут твой пост делает?
Не собираешься ничего писать - держи слово, проходи мимо. На тебя слишком много жалоб последнее время. Лучше молчи в тряпочку, если без провокаций не можешь.
Начиная с этой темы я буду тебе выписывать горчичники за непочтительное обращение к форумчанам - учти это.
I'm learning to live...
Stilet вне форума
Старый 21.02.2014, 14:23   #9
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Да? И что же тогда тут твой пост делает?
Да потому что ты сам меня первый тут зацепил!

Цитата:
Сообщение от Stilet Посмотреть сообщение
Начиная с этой темы я буду тебе выписывать горчичники за непочтительное обращение к форумчанам - учти это.
Вот себе первому и выпиши, потому что в данном случае виноват ты! Какого ты меня в теме упомянул, когда я ни слова тут не написал? Переход на личности. Нарушение правила форума. От ТЕБЯ!
doktor255 вне форума
Старый 21.02.2014, 14:27   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Да потому что ты сам меня первый тут зацепил!
ту тему тоже Стилет зафлудил?
написана же причина по которой упомянули, нет же недотрогу строим.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
получение данных из файла и запись этих данных в другой. Jurii77 Microsoft Office Excel 9 23.11.2011 09:42
Запись в ресурсы собственного exe? Человек_Борща Общие вопросы Delphi 3 02.08.2010 15:19
Как задать команду загрузки файлов данных на кнопку если каталог и имена файлов известны??? Andbuba Microsoft Office Excel 2 28.12.2008 17:28
Отчет времени на своей иконке в SYSTray Yuran Общие вопросы Delphi 1 04.06.2008 23:43
Ресурсы, зачем нужны ресурсы Hallo Обсуждение статей 0 12.12.2006 21:30