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


Автор: DeMoNN 3.1.2009, 00:31
Доброго времени суток. Можно ли как-нибудь впихнуть любой файл в ресурс или прилинкковать его к самой программе так, чтобы с ним можно было работать как с файлом (копировать на диск, а там, собственно, работать, если быть точнее ), и как это сделать?

Автор: Borland_Delphi_6 3.1.2009, 00:33
Вроде бы тип RCDATA позволяет любые бинарные данные хранить, разве нет?

Автор: DeMoNN 3.1.2009, 00:54
позволять то он позволяет - я о нем только это и нашел. А вот как с ним работать?

Автор: AntonN 3.1.2009, 00:59
создаешь ресурс с файлом:
копируешь в одну папку brcc32.exe, файл для ресурса, создаешь файл 1.rc в котором пишешь FILEEXE MEGARES "file.exe". Запускаешь brcc32.exe 1.rc, в этой же папке создастся файл 1.res. Его прикрепляешь к своей проге.

В самой проге для извлечения ресурса делаешь что то типа этого:
Код

var
  stream: TResourceStream;
begin
  stream := TResourceStream.Create(HInstance, 'FILEEXE', 'MEGARES');
  with TFileStream.Create('file.exe', fmCreate) do begin
    CopyFrom(stream, stream.Size);
    Free;
  end; 

Автор: DeMoNN 3.1.2009, 01:04
 smile  а что такое MEGARES и работает ли это с другими типами файлов. И куда попадает file.exe?

Автор: AntonN 3.1.2009, 01:11
DeMoNN, о brcc32.exe стоит почитать сначала smile формат строки файла описывающего ресурс:
FILEEXE MEGARES "file.exe"
1 - имя ресурса
2 - нахвание секции
3 - сам файл, который будет загнан в ресурс.

По TResourceStream тоже достаточно информации, спрашивай поконкретней smile

Автор: DeMoNN 3.1.2009, 01:22
так я же конкректно спросил: куда попадает file.exe smile 
А про TResourceStream сейчас попробую погуглить.

Автор: AntonN 3.1.2009, 01:24
DeMoNN, file.exe попадает в файл ресурса, а тот в свою очередь прикрепляется к твоей программе.

Автор: DeMoNN 3.1.2009, 01:37
AntonN, я имел в виду не это - это и так понятно smile 
А куда он попадает после CopyFrom(stream, stream.size)
Погуглил, понял. Нашел очень похожий но чуть более понятный для меня код. Спасибо!

Автор: AntonN 3.1.2009, 01:40
в случае с копированием в TFileStream - на диск, в TMemoryStream - в "память".

Автор: DeMoNN 3.1.2009, 01:43
 smile уже понял smile 
Спасибо

Автор: JackA 6.8.2011, 22:08
     Чайницкий вопрос. Мне нужно в ресурс занести 2 ВМР и 1 WAV. Можно это сделать в одном .rc или для каждого файла делать отдельный .rc ? И правильно ли я понимаю : файл из ресурса воспринимается как обычный файл, но только находящийся в памяти самой программы, а не на носителе,  и доступен по имени,  как и обычный файл, только только с несколько видоизмененным вызовом ?

Автор: Snowy 6.8.2011, 22:44
В один rc файл можно заносить любое количество файлов, не превышающее 2Гб.
Файл из ресурсов воспринимается, как набор данных, а не как файл.
Что касается обращения, то оно тоже отлично. Но, если использовать TResourceStream, то получаем единообразную работу со стримами, которая сходна с работой с файлами.

Автор: JackA 7.8.2011, 10:19
    Thanks !
    Значит, в *.rc  каждый  свой включаемый  файл  описываю  одной  строкой ?  Или через запятую ?

Автор: Snowy 7.8.2011, 17:10
Каждый файл отдельной строкой

Автор: JackA 27.10.2011, 12:23
  Нужны 2 кнопки с рисунком типа BitBtn, чтобы картинка грузилась из ресурсов.

  Скомпилил файл BitBMP.res из rc вида :
  MYBMPU RCDATA "UP.BMP"
  MYBMPD RCDATA "DOWN.BMP"
  ( почему-то один из источников настаивает, что надо именно в верхнем регистре )

  Но вот подключать - засада : любой из методов требует Cardinal, где взять этого кардинала - непонятка.

BitBtn1.Glyph.LoadFromResourceName (Instance:Cardinal; const ResNam:String),
BitBtn1.Glyph.LoadFromResourcelD (Instance:Cardinal; ResID:Integer),

   В случае со звуком из ресурса было без проблем : 

 
Код


  hResource := LoadResource(hInstance, FindResource(hInstance, 'MyWAVe',
      RT_RCDATA));

    try
      pData := LockResource(hResource);

      if pData = nil then
        raise Exception.Create('Cannot read MyWave');

    // Здесь pData указывает на MyWave
    // Теперь можно, например, проиграть его (Win32):
    finally
    end;
    PlaySound(pData, 0, SND_MEMORY);
 

   Попытался вместо кардинала подсунуть ему pData - ругается на несовместимость типов.

    Как быть, подскажите, плииз.

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