Страница 1 из 1
Хранение файла в ресурсе
Добавлено: 16 сен 2004, 16:58
Dmitry
Зашил в ресурсы программы шаблон для файла. Теперь не могу его достать, чтобы записать на диск. Раньше имел дело только с иконками в ресурсе (TBitmap & etc.). Как быть?
Добавлено: 21 сен 2004, 08:05
Naeel Maqsudov
Код: Выделить всё
type
tbuf=array[0..2048] of char;
procedure TForm1.Button1Click(Sender: TObject);
var
hFile,hResInfo,hGlobal:THandle; ResSize:longint; PRes:^tbuf;
Written:Cardinal;
begin
hResInfo:=FindResource(HInstance,'RCDATA_1',RT_RCDATA);
if hResInfo<>0 then begin
hGlobal:=LoadResource(HInstance,hResInfo);
ResSize:=SizeofResource(HInstance,hResInfo);
Pres:=LockResource(hGlobal);
hFile:=CreateFile('C:\qwe.txt',GENERIC_WRITE,0,nil,CREATE_ALWAYS,0,0);
if hFile<>INVALID_HANDLE_VALUE then begin
WriteFile(hFile,PRes^,ResSize,Written,nil);
FileClose(hFile);
end;
end;
end;
Только учтите, что ResSize может на несколько байт быть больше длины исходного файла!
Можно дополнить добавляемый в ресурс файл двойным словом со значением его длины, а при извлечении использовать тип
Код: Выделить всё
type
tbuf=record
Len: dword;
Data: array[0..2048] of char;
end;
И соответственно
WriteFile(hFile,PRes^.Data,PRes^.Len,Written,nil);
Добавлено: 22 сен 2004, 04:27
Dmitry
Спасибо большое, Наиль. Все заработало.
Только вот последнее замечание про результат функции SizeofResource непонятно (на MSDN про этот ньюанс я ничего не нашел).
В каких случаях возникает такая ситуация?
p.s. привет из солнечной Калуги :P
Добавлено: 22 сен 2004, 10:54
Naeel Maqsudov
Я добавлял ресурс через меню Project/Resouces (D6), просто добавлял файл в ресурс.
В трех случаях из трех длина выгруженного файла оказывалась больше на 1-3 байта (дополнено нулями).
Вроде бы похоже на выравнивание по границе двойного слова в скомпилированном файле, НО длина выгруженного файла не кратна четырем.
Надо было выключить оптимизацию, и скомпилировать еще раз, но времени уже не было.
Т.е. у меня во всех попытках SizeofResource было чуть больше длины исходного добавленного файла.
p.s. привет из солнечной Калуги
Спасибо
