Хранение файла в ресурсе
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
Зашил в ресурсы программы шаблон для файла. Теперь не могу его достать, чтобы записать на диск. Раньше имел дело только с иконками в ресурсе (TBitmap & etc.). Как быть?
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Код: Выделить всё
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;
Можно дополнить добавляемый в ресурс файл двойным словом со значением его длины, а при извлечении использовать тип
Код: Выделить всё
type
tbuf=record
Len: dword;
Data: array[0..2048] of char;
end;
WriteFile(hFile,PRes^.Data,PRes^.Len,Written,nil);
Спасибо большое, Наиль. Все заработало.
Только вот последнее замечание про результат функции SizeofResource непонятно (на MSDN про этот ньюанс я ничего не нашел).
В каких случаях возникает такая ситуация?
p.s. привет из солнечной Калуги :P
Только вот последнее замечание про результат функции SizeofResource непонятно (на MSDN про этот ньюанс я ничего не нашел).
В каких случаях возникает такая ситуация?
p.s. привет из солнечной Калуги :P
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Я добавлял ресурс через меню Project/Resouces (D6), просто добавлял файл в ресурс.
В трех случаях из трех длина выгруженного файла оказывалась больше на 1-3 байта (дополнено нулями).
Вроде бы похоже на выравнивание по границе двойного слова в скомпилированном файле, НО длина выгруженного файла не кратна четырем.
Надо было выключить оптимизацию, и скомпилировать еще раз, но времени уже не было.
Т.е. у меня во всех попытках SizeofResource было чуть больше длины исходного добавленного файла.

В трех случаях из трех длина выгруженного файла оказывалась больше на 1-3 байта (дополнено нулями).
Вроде бы похоже на выравнивание по границе двойного слова в скомпилированном файле, НО длина выгруженного файла не кратна четырем.
Надо было выключить оптимизацию, и скомпилировать еще раз, но времени уже не было.
Т.е. у меня во всех попытках SizeofResource было чуть больше длины исходного добавленного файла.
Спасибоp.s. привет из солнечной Калуги
