Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Неверное сохранение иконки файла


Автор: ShadowDancer 13.9.2008, 14:04
Данный код отлично работает, если я извлекаю обычный файл из ресурса, но вот если я извлекаю иконку, то происходят проблемы, а именно: записывает всего лишь 34 байта от этой иконки.

Код


procedure MemToFile(FileName: string; var Memory: pointer; MemSize: integer);
var
  h: THandle;
  tmp: DWORD;
begin
h := CreateFile (PChar(FileName), MAXIMUM_ALLOWED, FILE_SHARE_READ, nil, CREATE_ALWAYS, 0, 0);
     WriteFile (h, Memory^, MemSize, tmp, nil);
     CloseHandle(h);
end;

procedure GetResource;
var
  Resource, HResInfo, ID: THandle;
  size: integer;
  p: pointer;
begin
 ID := LoadLibrary(PChar('file.exe'));
 HResInfo := FindResource(ID, 'MAINICON', RT_GROUP_ICON); 
 Resource := LoadResource(ID, HResInfo);
 p := LockResource(Resource);
 size := SizeofResource(ID, HResInfo);
 MemToFile('0xffff.ico', p, size);
 UnLockResource(Resource);
 FreeResource(Resource);
end

 

про ExtractIcon читал, что при извлечении, в некоторых случаях происходит потеря качаства иконки - из-за этого не использовал. В чём проблема с этим кодом ? Если у вас есть полностью рабочий код на чистейшем api по извлечению, то буд рад если вы поделитесь. Примеры по извлечению, которые попадались на глаза изпользовали другие модули

Автор: bems 13.9.2008, 15:17
ресурс-иконка и файл с иконкой внутри не одно и то же (а именно: файл содержит ресурс и еще какой-то хедер). Даже если этот код работает правильно, то все равно полученый файл не будет нормальным файлом иконки.

Автор: ShadowDancer 13.9.2008, 15:30
ну файл то - это обычный exe-шник, а эти функции и созданы для работы с exe-шниками

Автор: bems 13.9.2008, 15:44
я имел в виду что если ты сравнишь двоичное содержимое ресурса типа ICON и файла с расширением ico, то увидишь что второй в конце полностью содержит первый, а в начале есть еще какой-то блок.

Автор: ShadowDancer 13.9.2008, 16:04
впринципе, мне бы её хоть какую получить, но главное что бы через api, и сама ОС не изменяла содержимое файла

Автор: bems 13.9.2008, 16:13
екзешник твой? если да, то в ресурсе храни не иконку, а ico-файл

Добавлено через 1 минуту и 36 секунд
а, и еще: RT_GROUP_ICON и RT_ICON не одно и то же

Автор: Alexeis 13.9.2008, 16:16
ShadowDancer, там есть 2 типа ресурсов IconDir где описание того скока кадров иконке и сами кадры. Все это храниться отдельно. 

Советую ознакомиться с этой статьей. http://msdn.microsoft.com/en-us/library/ms997538.aspx
Тут все написано. Не так уж и сложно это все извлекается.

Автор: ShadowDancer 13.9.2008, 17:27
bems, эксешник может быть любым.

Alexeis, спасибо, ща постараюсь вникнуть

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)