Code: |
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 old rubbish will do!} if FS.Size mod SizeOf(DWORD) <> 0 then RS.WriteBuffer(Padding, SizeOf(DWORD) - FS.Size mod SizeOf(DWORD));
{ закрываем файлы } FS.Free; RS.Free; end; |
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!