Валентин Озеров

Книги → Советы по Delphi. Версия 1.4.3 от 1.1.2001 → Сохранение и выдёргивание ресурсов в DLL или EXE

Письмо читателя

Иногда возникает необходимость вшить ресурсы в исполняемый файл Вашего приложения (например чтобы предотвратить их случайное удаление пользователем, либо, чтобы защитить их от изменений). Данный пример показывает как вшить любой файл как ресурс в EXE-шнике. Совместимость: Delphi 3.x (или выше)

Далее рассмотрим, как создать файл ресурсов, содержащий корию какого-либо файла. После создания такого файла его можно легко прицепить к Вашему проекту директивой {$R}. Файл ресурсов, который мы будем создавать имеет следующий формат:

+ заголовок

+ заголовок для нашего RCDATA ресурса

+ собственно данные - RCDATA ресурс

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

Заголовок ресурса выглядит следующим образом:

TResHeader = record

 DataSize: DWORD;        // размер данных??????

 HeaderSize: DWORD;      // размер этой записи

 ResType: DWORD;         // нижнее слово = $FFFF => ordinal

 ResId: DWORD;           // нижнее слово = $FFFF => ordinal

 DataVersion: DWORD;     // *

 MemoryFlags: WORD;

 LanguageId: WORD;       // *

 Version: DWORD;         // *

 Characteristics: DWORD; // *

end;

Поля, помеченные звёздочкой, Мы не будем использовать. Приведённый код создаёт файл ресурсов и копирует его в данный файл:

Листинг 1:

procedure CreateResourceFile(

 DataFile, ResFile: string; // имена файлов

 ResID: Integer //    id ресурсов

);

var

 FS, RS: TFileStream;

 FileHeader, ResHeader: TResHeader;

 Padding: array[0..SizeOf(DWORD)-1] of Byte;

begin

 { Open input file and create resource file }

 FS := TFileStream.Create( // для чтения данных из    файла

  DataFile, fmOpenRead);

 RS := TFileStream.Create( // для записи файла    ресурсов

  ResFile, fmCreate);

 { Создаём заголовок файла ресурсов - все    нули, за исключением HeaderSize, ResType и ResID }

 FillChar(FileHeader, SizeOf(FileHeader), #0);

 FileHeader.HeaderSize := SizeOf(FileHeader);

 FileHeader.ResId := $0000FFFF;

 FileHeader.ResType := $0000FFFF;

 { Создаём заголовок данных для RC_DATA файла

 Внимание: для создания более одного ресурса необходимо повторить следующий процесс,    используя каждый раз различные ID ресурсов }

 FillChar(ResHeader, SizeOf(ResHeader), #0);

 ResHeader.HeaderSize := SizeOf(ResHeader);

 // id ресурса - FFFF означает "не строка!"

 ResHeader.ResId := $0000FFFF or (ResId shl 16);

 // тип ресурса - RT_RCDATA (from Windows unit)

 ResHeader.ResType := $0000FFFF or (WORD(RT_RCDATA) shl 16);

 // размер данных - есть размер файла

 ResHeader.DataSize := FS.Size;

 // Устанавливаем необходимые флаги памяти

 ResHeader.MemoryFlags := $0030;

 { Записываем заголовки в файл ресурсов }

 RS.WriteBuffer(FileHeader, sizeof(FileHeader));

 RS.WriteBuffer(ResHeader, sizeof(ResHeader));

 { Копируем файл в ресурс }

 RS.CopyFrom(FS, FS.Size);

 { Pad data out to DWORD boundary - any oldrubbish will do!}

← предущий раздел следующая →

Страницы раздела: 1 2

Публикация компанией Dropbox кода Zulip – средства общения для IT-разработчиков

20.11.2015
Одной из одобрительно встреченных программистами инициатив, реализующихся в рамках акции Hack Week, стала публикация исходного кода приложения Zulip – веб-приложения для общения между собой разработчиков в сфере IT-технологий.

Объединение ОС Android и Chrome

17.11.2015
Слухи об объединении двух крупнейших ОС компании Google, Android и Chrome, гуляют по Интернету уже более 5 лет, но до сих пор этого не случилось, хотя очевидно, что с течением времени эти ОС становятся всё более похожими: так, в последнее время появилось немало Android-устройств, к которым прилагаются клавиатуры, а Chrome OS «научилась» работать с сенсорными экранами.

Конференция Linux Piter 2015

15.11.2015
Уже почти через неделю в Санкт-Петербурге впервые в истории пройдёт конференция, посвящённая проблемам свободного программного обеспечения – Linux Piter 2015.