Хранение файла в ресурсе

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Dmitry
Сообщения: 8
Зарегистрирован: 22 июн 2004, 15:47

Зашил в ресурсы программы шаблон для файла. Теперь не могу его достать, чтобы записать на диск. Раньше имел дело только с иконками в ресурсе (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;
Только учтите, что ResSize может на несколько байт быть больше длины исходного файла!
Можно дополнить добавляемый в ресурс файл двойным словом со значением его длины, а при извлечении использовать тип

Код: Выделить всё

type
  tbuf=record
    Len: dword;
    Data: array[0..2048] of char;
  end;
И соответственно

WriteFile(hFile,PRes^.Data,PRes^.Len,Written,nil);
Dmitry
Сообщения: 8
Зарегистрирован: 22 июн 2004, 15:47

Спасибо большое, Наиль. Все заработало.
Только вот последнее замечание про результат функции SizeofResource непонятно (на MSDN про этот ньюанс я ничего не нашел).
В каких случаях возникает такая ситуация?


p.s. привет из солнечной Калуги :P
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Я добавлял ресурс через меню Project/Resouces (D6), просто добавлял файл в ресурс.
В трех случаях из трех длина выгруженного файла оказывалась больше на 1-3 байта (дополнено нулями).

Вроде бы похоже на выравнивание по границе двойного слова в скомпилированном файле, НО длина выгруженного файла не кратна четырем.

Надо было выключить оптимизацию, и скомпилировать еще раз, но времени уже не было.

Т.е. у меня во всех попытках SizeofResource было чуть больше длины исходного добавленного файла.
p.s. привет из солнечной Калуги
Спасибо :)
Ответить