Chertenok.ru - все о программировании
Вход  |  Регистрация  |  Поиск 
Праздник
Через 3 дня :

День славянской письменности и культуры


И опять про работу с ресурс файлами


Новая тема  Ответить  Печать Предыдущая тема  Следующая тема
Автор Сообщение
rlzz
Гость







СообщениеСр, 26-Июл-2006 23:05    Заголовок сообщения: И опять про работу с ресурс файлами
Цитата

var
RcInfo: HRSRC;
Rc: THandle;
Data: Pointer;
begin
RcInfo := FindResource(0,ResourceName,ResourceType);
Rc := LoadResource(0,RcInfo);
Data := LockResource(Rc);
end;


Собственно вапрос ,как его на винт то записать?? Заранее СПС
В начало
DrPass
Знающий :)
/Почетный Модератор/


Возраст: 31
Знак зодиака: Лев
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
СообщениеСр, 26-Июл-2006 23:55 
Цитата

записать-то легко. Но нужно знать одну маленькую весчь - размер этого ресурса в памяти.
f: file;
assignfile(f, 'file.dat');
rewrite(f, 1);
blockwrite(f, data^, <размер>);
closefile(f);

Как узнать размер - вопрос риторический. Ответ как минимум зависит от типа ресурса

_________________
Да пребудет с вами Сила!
В начало
Посмотреть профиль Отправить личное сообщение
rlzz
Гость







СообщениеЧт, 27-Июл-2006 0:55 
Цитата

dll ки выташить надо и ехе

Добавлено спустя 33 минуты 59 секунд:

RT_RCDATA
В начало
DrPass
Знающий :)
/Почетный Модератор/


Возраст: 31
Знак зодиака: Лев
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
СообщениеЧт, 27-Июл-2006 9:08 
Цитата

Тогда разумнее всего перед файлами в ресурс сохранить их размер. Например, если в первых четырех байтах хранится размер файла, это будет выглядеть примерно так:
f: file;
p: ^integer;

assignfile(f, 'file.dat');
rewrite(f, 1);
p:= data;
inc(integer(data), 4); //передвигаем указатель на 4 байта вперед - туда, где начинаются реальные данные
blockwrite(f, data^, p^);
closefile(f);

_________________
Да пребудет с вами Сила!
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж Ktf
Администратор


Возраст: 32
Знак зодиака: Рак
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
СообщениеЧт, 27-Июл-2006 9:49 
Цитата

у меня была программа, внутри которой хранилось куча исполняемых файлов и дллек, которые по необходимости извлекались и сохранялись на винт.
так вот, для этой проги я написал универсальную функцию для извлечения бинарных данных из ресурсов и сохранения их на винт.
только у меня проблем с определением длины ресурса не возникало.
delphi:
  1. function TMain.SaveResourceToDisk(ResID: Integer; ResType: PChar; ResFile: string): boolean;
  2. var
  3.   RS: TResourceStream;
  4.   FS: TFileStream;
  5.   res_data: pbyte;
  6.   c: integer;
  7.   res_h: cardinal;
  8. begin
  9.   res_h:=FindResource(HInstance, Pchar(ResID), ResType);
  10.   result:=res_h<>0;
  11.   if not result then exit;
  12.   try
  13.     RS:=TResourceStream.CreateFromID(HInstance, ResID, ResType);
  14.     FS:=TFileStream.Create(ResFile, fmCreate);
  15.     res_data:=nil;
  16.     try
  17.       // считываем ресурс
  18.       c:=RS.Size;
  19.       res_data:=GetMemory(c);
  20.       CopyMemory(res_data, RS.Memory, c);
  21.       // сохраняем ресурс в файл
  22.       FS.Write(PByte(res_data)^, c);
  23.     finally
  24.       if res_data<>nil then
  25.         FreeMemory(res_data);
  26.       RS.Free;
  27.       FS.Free;
  28.     end;
  29.   except
  30.     raise;
  31.     result:=false;
  32.   end;
  33. end;

пример использования
delphi:
  1. if not SaveResourceToDisk(101, RT_RCDATA, ExtractFilePath(Application.ExeName)+'extracted.exe')
  2.   then ShowMessage('Ошибка извлечения ресурса!');

_________________
Пойду посплю перед сном.
В начало
Посмотреть профиль Отправить личное сообщение
rlzz
Гость







СообщениеЧт, 27-Июл-2006 10:32 
Цитата

здесь класы используются ето не неда........
В начало
Пол:Муж Ktf
Администратор


Возраст: 32
Знак зодиака: Рак
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
СообщениеЧт, 27-Июл-2006 10:38 
Цитата

ну посмотри как в классах реализовано.

Добавлено спустя 1 минуту 37 секунд:

всего-то и надо что заглянуть внутрь TResourceStream.Create, TResourceStream.Size и TResourceStream.Memory

_________________
Пойду посплю перед сном.
В начало
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Страница 1 из 1
Перейти:  
Новая тема  Ответить  Печать

Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете присоединять файлы в этом форуме
Вы можете скачивать файлы в этом форуме
хостинг от .masterhost 
Rambler's Top100